接私活做預算的網(wǎng)站百度競價推廣開戶費用
內(nèi)部類
一:初始內(nèi)部類
(1)什么是內(nèi)部類?
類的五大成員:屬性、方法、構(gòu)造方法、代碼塊、內(nèi)部類
舉例:在A類的內(nèi)部定義B類,B類就被稱為內(nèi)部類
public class Outer { // 外部類public class Inter { // 內(nèi)部類}
}
public class Test { // 外部其他類public static void main(Strig[] args) {}
}
(2)為什么要學習內(nèi)部類?
需求:寫一個JavaBean類描述汽車
屬性:汽車的品牌,車齡,顏色,發(fā)動機的品牌,使用年限
public class Car {Stirng carName;int carAge;String carColor;String engineName;int engineAge;
}
// 上面這種乍一看沒什么問題,但是發(fā)動機是一個獨立的個體,跟車本身還是有一些區(qū)別的,所以跟發(fā)動機相關(guān)的屬性我們不應(yīng)該和車定義
//在一起,是不是可以再定義一個發(fā)動機的類?是的可以。但是發(fā)動機是需要依賴車存在的,發(fā)動機如果單獨存在是沒有實際意義的,所以最好
//的解決方案是把發(fā)動機Engine這個類定義在Car類的里面,這樣就滿足要求,這樣就表示車的里面有發(fā)動機,而發(fā)動機又是一個獨立的個體。
//此時Car就是外部類,Engine就是內(nèi)部類
public class Car { // 外部類Stirng carName;int carAge;String carColor;class Engine { // 內(nèi)部類String engineName;int engineAge;}
}
內(nèi)部類表示的事物是外部類的一部分,內(nèi)部類單獨出現(xiàn)沒有任何意義
(2)內(nèi)部類的訪問特點:
1、內(nèi)部類可以直接訪問外部類的成員,包括私有
2、外部類要訪問內(nèi)部類的成員,必須創(chuàng)建對象
public class Test {public static void main(String[] args) {Car c = new Car();c.setCarName("賓利");c.setCarAge(1);c.setCarColor("粉色");// 調(diào)用show方法的時候會把當前調(diào)用者的地址值傳遞給show方法的形參,// 所以show方法的形參有一個隱含的this關(guān)鍵字,用this去訪問自己類里面屬性沒問題// 用this去訪問Engin里面的engineName找不到,所以需要在show方法里面創(chuàng)建// Engin類的對象,用對象才能找到engineNamec.show();}
}class Car {private String carName;private int carAge;private String carColor;class Engine {private String engineName;private int engineAge;public void show() {System.out.println(engineName);// 內(nèi)部類可以直接訪問外部類的成員,包括私有System.out.println(carName);}}public void show(Car this) {// 是打印調(diào)用者車的名字:賓利System.out.println(this.carName);System.out.println(this.engineName); // ???Engine e = new Engine();System.out.println(e.engineName);}
}
以后這個內(nèi)部類怎么用呢?看一段java的源代碼就知道了:
看ArrayList的源碼,找到Itr這個類,
ArrayList是一個集合,集合的作用就是用來幫我們存儲元素的,我們可以把數(shù)據(jù)往集合里面放,也可以通過遍歷的方式把集合里面的元素獲取出來,但是ArrayList的遍歷方式有很多很多種,之前我們僅僅是用for循環(huán)遍歷,除了for循環(huán)還有很多遍歷方式。這里看到的Itr專業(yè)叫做迭代器,也是一種遍歷方式,這種集合遍歷方式對于集合來講是相對獨立的,但是他又屬于集合,所以Java就把迭代器這個類設(shè)計成了ArrayList的內(nèi)部類。一定要先有集合才能有迭代器,所以Java就把迭代器設(shè)計成了ArrayList的內(nèi)部類。
(3)小結(jié)
1、什么是內(nèi)部類?
寫在一個類里面的類就叫做內(nèi)部類
2、什么時候用到內(nèi)部類?
B類表示的事物是A類的一部分,且B類單獨存在沒有意義。
比如:汽車的發(fā)動機、ArrayList的迭代器、人的心臟等等。
二:成員內(nèi)部類(了解)
1、成員內(nèi)部類的代碼如何書寫
1)寫在成員位置的,屬于外部類的成員。比如剛剛寫的Car類和Engine類。他跟外面的成員變量、成員方法的地位是一模一樣的。
public class Car { // 外部類Stirng carName;int carAge;String carColor;class Engine { // 內(nèi)部類String engineName;int engineAge;}
}
2)成員內(nèi)部類可以被一些修飾符所修飾,比如:private、默認、protected、public、static等
如果用private私有去修飾成員內(nèi)部類的話,那么在外界就不能直接創(chuàng)建成員內(nèi)部類的對象,只能在外部類的里面去創(chuàng)建內(nèi)部類的對象,因為private是只能在本類中使用。
3)在成員內(nèi)部類里面,JDK16前不能定義靜態(tài)變量,JDK16開始才可以定義靜態(tài)變量
public class Outer {String name;private class Inner {static int a = 10; // JDK16以下會報錯}public Inner getInstance() {return new Inner();}
}
2、如何創(chuàng)建成員內(nèi)部類的對象
1、方式一:在外部類中編寫方法,對外提供內(nèi)部類的對象
這種方式用在用private修飾內(nèi)部類的時候用這種
比如集合的迭代器Itr這個內(nèi)部類,它使用private修飾的private class Itr implements Iterator<E> {}
,外界如何獲取迭代器Itr的對象?
調(diào)用集合的iterator方法獲取,返回的類型不是Itr,而是Itr實現(xiàn)的接口Iterator類型,所以外界用接口的類型去接收就可以了,形成了接口多態(tài)。
public Iterator<E> iterator() {return new Itr();}
如果不是用private修飾的一般用第二種方式獲取內(nèi)部類的對象