1. 程式人生 > 其它 >JAVA 內部類與組合的異同

JAVA 內部類與組合的異同

1. 內部類與組合的異同

結構上:一個是類中的類,看大括號,組合就是一個變數,是沒有大括號的。而且內部類是由class修飾的。(匿名內部類除外)
組合:組合是一種程式碼複用機制,組合的是物件,通俗的理解是在一個類中建立或引用另一個類的物件。
使用多個已有的物件組合為一個功能更加複雜強大的新物件,因為在物件之間,各自的內部細節是不可見的,所以也說這種方式的程式碼複用是黑盒式程式碼複用。
組合模式:組合多個物件形成樹形結構以表示有整體-部分關係層次結構,組合模式可以讓客戶端統一對待單個物件和組合物件。

	**簡單的說:內部類是類中類,組合是把一個類當做了成員變數。**

2. 內部類的型別

內部類是一種程式碼隱藏機制

,通俗的理解是在一個類的內部定義另一個類(類中類)。根據定義位置的不同,可以分為:成員內部類、區域性內部類、匿名內部類和靜態內部類

內部類可以無條件訪問外部類的所有成員屬性和成員方法(包括private成員和靜態成員);外部類需要建立內部類的物件,才能訪問內部類的成員和方法。

點選檢視程式碼
class Circle {
    //1、成員位置
    double radius = 0;             //成員變數
     
    public Circle(double radius) { //構造方法
        this.radius = radius;
    }
    
    class Draw {                    //成員內部類,可以有修飾符
        double radius = 1;
        public void drawSahpe() {
            System.out.println("drawshape");
        }
}
  
Static class Draw2 {                   //靜態內部類,一種特殊的成員內部類
        public void draw2 () {
            System.out.println("draw2");
        }
}
  
   public double getArea(){    //方法
    //2、區域性位置
        double pai=3.14;        //區域性變數
        
        class A{                //區域性內部類:不能有修飾符
            ……
        }
        return pai*radius*radius;
    }
}
2.1成員內部類

①修飾符public、protected、private以及static(靜態內部類)
②當成員內部類擁有和外部類同名的成員變數或者方法時,會發生隱藏現象,即預設情況下訪問的是成員內部類的成員。如果要訪問外部類的同名成員,需要以下面的形式進行訪問:
外部類.this.成員變數
外部類.this.成員方法
③成員內部類是依附外部類而存在,如果要建立成員內部類的物件,前提是必須存在一個外部類的物件

Circle c = new Circle();
Circle.Draw d = c.new Draw();
或者可以寫成:
Circle.Draw d = new Circle().new Draw();

2.2靜態內部類
    靜態內部類是一個static修飾的成員內部類。

靜態內部類和靜態成員變數類似,不需要依賴於外部類,即不用建立外部類物件就能訪問。
Circle.Draw2 d2 = new Circle.Draw2();
靜態內部類不能訪問外部類的非static成員變數或者方法。因為非靜態的成員變數和方法,必須用類物件訪問。

2.3區域性(方法)內部類

①訪問僅限於方法內或者該作用域內,所以在方法內部建立物件
不能有修飾符

3.4匿名內部類

匿名內部類就是一個沒有名字的區域性(方法)內部類。
匿名內部類必須繼承一個抽象類或者實現一個介面
匿名內部類沒有類名,因此沒有構造方法。

點選檢視程式碼
//介面
interface myItface{
    void test();
}
class Outer{
    private int n = 5; 
    public void dispaly(int temp)
    {
        new myItface()//實現並呼叫了test()方法
        {
            public void test()
            {
                System.out.println(temp);
            }
        }.test();
    }
}