歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java基礎之內部類

1、Java中的內部類都有什麼?!

  • 成員內部類
  • 局部內部類
  • 匿名內部類
  • 靜態內部類

2、內部類詳解

    •成員內部類

      在一個類的內部再創建一個類,成為內部類

      1)在一個類中使用內部類,可以在內部類中直接存取所在類的私有屬性或方法

 1 class Outer{
 2     //外部類Outer
 3     private int i = 111 ;//外部類私有變量
 4     class Inner{
 5         //內部類Inner
 6         private int j = 222 ;//內部類私有變量
 7         public void print(){
 8             System.out.println("外部類的私有屬性"+ i);
 9             System.out.println("內部類的私有屬性"+ j);
10         }
11     }
12 }
13 public class ClassDemo5 {
14     public static void main(String[] args) {
15         Outer o = new Outer() ;
16         Outer.Inner i = o.new Inner() ; 
17         i.print() ;
18     }    
19 }

       2)內部類的實例化方法

import 面向對象基礎.Outer.Inner;  
//第一種方式:導入import 面向對象基礎.Outer.Inner;包
Outer.Inner i = o.new Inner() ;
 //第二種方式:外部類.內部類 對象名 = 外部類對象.new 內部類

         3)外部類訪問內部類

1 class Fatch{
2    //外部類Fatch
3    public class Student{
4        //內部類Student
5        public void show(){
6            //內部類show()方法
7            System.out.println("內部類Student的show()方法");
8         }
9     }
10    public void print(){
11        /**
12         * 外部類不可以直接訪問內部類的屬性或方法,
13         * 必須創建內部類對象才可以訪問
14          */
15        new Student().show() ;    //使用匿名對象實例化調用內部類的類成員
16        System.out.println("外部類Fatch的print()方法");
17     }
18 }
19 public class ClassDemo4 {
20    public static void main(String[] args) {
21        Fatch f = new Fatch() ;    //實例化外部類對象
22        f.print() ;    //調用外部類的print()方法
23     }
24 }

4)如果外部類和內部類具有相同的成員變量或方法,內部類默認訪問自己的成員變量或方法,如果要訪問外部類的成員變量,可以使用 this 關鍵字。

1 class Outer1 {
2    //外部類
3    private int i = 10 ;//外部類私有變量
4    class Inner1{
5        //內部類
6        private int i = 20 ;//內部類私有變量
7        public void show(){
8            //內部類方法
9            System.out.println("內部類的變量"+ this.i );//使用this關鍵字訪問內部類成員
10            System.out.println("外部類的變量"+ Outer1.this.i);//使用外部類名.this.變量名 來訪問外部類成員
11         }
12     }
13    public void print(){
14        new Inner1().show() ;    //調用內部類方法
15     }
16 }
17 public class ClassDemo6 {
18    public static void main(String[] args) {
19        new Outer1().print() ;  
20     }
21
22 }

        •注意點:

          »實例化內部類之前必須實例化外部類

          »內部類可以隨意訪問他的外部類成員,但外部類不可以直接訪問內部類的類成員

          »內部類可以被聲明為private 或 protected 權限的訪問

          »內部類對象會依賴於外部類對象,除非已經存在一個外部類對象,否則類中不會出現內部類對象

    •局部內部類(方法內部類)

      內部類不僅可以在類中進行定義,也可以在類的局部位置進行定義,例如在類的方法或者任意的作用域中都可以定義內部類

         1)在外部類的方法中定義一個方法內部類

 1 class Demo1{
 2     //外部類Demo
 3      final int I = 10 ;//外部類定義的常量
 4      public void show(){    //外部類的show()方法
 5          class Inne{        //方法內部類
 6              int j = 20 ;    //方法內部類變量
 7              private void inshow() {    //方法內部類中的inshow()方法
 8                  System.out.println("外部類常量"+ I );
 9                  System.out.println("方法內部類變量"+ j );
10             }
11          }
12          Inne in = new Inne()  ;    //實例化內部類對象
13          in.inshow() ;    //調用內部類方法
14      }
15 }
16 public class ClassDemo7 {
17     public static void main(String[] args) {
18         Demo1 d = new Demo1() ;
19         d.show() ;
20     }
21 }

    注意:如果方法中的參數需要被傳遞進去,就必須把參數聲明成final類型

      •靜態內部類

      如果一個內部類被聲明為static,此內部類就稱為外部類 

       1)靜態內部類可以通過(new 外部類名.內部類.內部類方法名) ,來調用靜態內部類方法

 
 1 class Outer2{
 2     //外部類
 3     private static String str = "張博傑" ;//外部類的靜態變量
 4     static class Inner2{
 5         //使用static聲明 的靜態內部類
 6         public void fun() {
 7             //靜態內部類方法
 8             System.out.println("外部類的靜態變量"+" "+ str);
 9         }
10     }
11 }
12 public class ClassDemo8 {
13     public static void main(String[] args) {
14         new Outer2.Inner2().fun() ;
15         //靜態內部類可以使用new 外部類名.內部類.內部類方法名 ,來調用靜態內部類方法
16     }
17 }       

•匿名內部類

匿名內部類也就是沒有名字的內部類,正因為沒有名字,所以匿名內部類只能使用一次,它通常用來簡化代碼編寫.使用匿名內部類還有個前提條件:必須繼承一個父類或實現一個接口

1)匿名內部類的實現

 1 abstract class A2 {    //抽象類A2
 2     public abstract void eat() ;
 3 }
 4 public class ClassDemo9 {
 5     public static void main(String[] args) {
 6         /**
 7          * 如果A2這個抽象類只用一次,那麼就可一使用匿名內部類來實現
 8          */
 9         A2 a = new A2(){
10             public void eat(){
11                 System.out.println("我要吃飯");
12             }
13         } ;
14         a.eat() ;
15     }
16 }

Copyright © Linux教程網 All Rights Reserved