內(nèi)部類(lèi):把一個(gè)類(lèi)定義到另外一個(gè)類(lèi)的內(nèi)部,在類(lèi)里面的這個(gè)類(lèi)就叫內(nèi)部類(lèi),外面的類(lèi)就叫外部類(lèi)。
作用:
? ? 1.封裝性:隱藏你不想讓別人知道的操作
? ? 2.每個(gè)內(nèi)部類(lèi)都能獨(dú)立的繼承一個(gè)接口的實(shí)現(xiàn),所以無(wú)論外部類(lèi)是否已經(jīng)繼承了某個(gè)(接口的)實(shí)現(xiàn),對(duì)于內(nèi)部類(lèi)都沒(méi)有影響。內(nèi)部類(lèi)使得多繼承的解決方案變得完整,
????3.方便編寫(xiě)事件驅(qū)動(dòng)程序
????4.方便編寫(xiě)線程代碼
? ? 5.在能實(shí)現(xiàn)功能的情況下,為了節(jié)省編譯后產(chǎn)生的字節(jié)碼(內(nèi)部類(lèi)可以減少字節(jié)碼文件,即java文件編譯后的.class文件)
內(nèi)部類(lèi):靜態(tài)內(nèi)部類(lèi),成員內(nèi)部類(lèi),局部?jī)?nèi)部類(lèi),匿名內(nèi)部類(lèi)
1.靜態(tài)內(nèi)部類(lèi)
? ??指被聲明為static的內(nèi)部類(lèi),他可以不依賴(lài)內(nèi)部類(lèi)而實(shí)例,而通常的內(nèi)部類(lèi)需要實(shí)例化外部類(lèi),從而實(shí)例化。靜態(tài)內(nèi)部類(lèi)不可以有與外部類(lèi)有相? ?同的類(lèi)名。不能訪問(wèn)外部類(lèi)的普通成員變量,但是可以訪問(wèn)靜態(tài)成員變量和靜態(tài)方法(包括私有類(lèi)型)
2.成員內(nèi)部類(lèi)
????成員內(nèi)部類(lèi)可以無(wú)條件訪問(wèn)外部類(lèi)的所有成員屬性和成員方法(包括private成員和靜態(tài)成員)。
????當(dāng)成員內(nèi)部類(lèi)擁有和外部類(lèi)同名的成員變量或者方法時(shí),會(huì)發(fā)生隱藏現(xiàn)象,即默認(rèn)情況下訪問(wèn)的是成員內(nèi)部類(lèi)的成員
public class OutClass {???????
?????public void test1() { }???????
?????class InnerClass {????????????
????????//成員內(nèi)部類(lèi)???????????
?????????private String testStrInner = "";?????????
? ? ? ? ?private void testInner() {????????????
????????????????test1();???//成員內(nèi)部類(lèi)可以訪問(wèn)外部類(lèi)所有的屬性和方法。靜態(tài)方法直接訪問(wèn)。????????????
??????????}
? ? }
}
3.局部?jī)?nèi)部類(lèi)
? ??局部?jī)?nèi)部類(lèi)是定義在一個(gè)方法或者一個(gè)作用域里面的類(lèi),它和成員內(nèi)部類(lèi)的區(qū)別在于局部?jī)?nèi)部類(lèi)的訪問(wèn)僅限于方法內(nèi)或者該作用域內(nèi)。
public class Animal {
????public static void bellow() {
????????String bellowStr = "動(dòng)物吼叫";
????????System.out.println(bellowStr);
????????final class Dog {
????????????//局部?jī)?nèi)部類(lèi)
????????????String dogBellowStr = bellowStr + ";狗 :汪汪汪";
????????????public void dogBellow() {
????????????????System.out.println(dogBellowStr);
????????????}
????????}
????}
}
4.匿名內(nèi)部類(lèi)
? ??匿名內(nèi)部類(lèi)就是沒(méi)有名字的內(nèi)部類(lèi)
//父類(lèi) Animal
public class Animal {
????public void bellow() {
????????//動(dòng)物吼叫的類(lèi)型
????????System.out.println("動(dòng)物吼叫");
????}
}
class Demo {
????public static void main(String[] args) {
????Demo demo = new Demo();
????demo.getDogBellow(new Animal(){
????????????//匿名內(nèi)部類(lèi),重寫(xiě)父類(lèi)方法。當(dāng)然接口也是一樣
????????????@Override
????????????public void bellow() {
????????????System.out.println("狗 汪汪汪。。。。");
????????????}
????});
}
public void getDogBellow(Animal animal){
????animal.bellow();
????}
}