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();
}
}