建設(shè)銀行軟件官方網(wǎng)站下載百度客服系統(tǒng)
目錄
一.內(nèi)部類
1.什么是內(nèi)部類
2.內(nèi)部類存在的原因
3. 內(nèi)部類的分類
4.內(nèi)部類的作用
二.成員內(nèi)部類
1.基本概念
2.成員內(nèi)部類的注意點(diǎn)
1.成員內(nèi)部類可以用private方法進(jìn)行修飾
2.成員內(nèi)部類可以直接訪問(wèn)外部類的私有屬性
3.外部類可以通過(guò)對(duì)象訪問(wèn)內(nèi)部類的私有屬性
4.成員內(nèi)部類中不可以定義static屬性和方法
?3.產(chǎn)生內(nèi)部類的對(duì)象
1.在外部類的內(nèi)部產(chǎn)生內(nèi)部類的對(duì)象
2.在外部類的外部產(chǎn)生內(nèi)部類的對(duì)象
三.靜態(tài)內(nèi)部類
1.基本概念
2.靜態(tài)內(nèi)部類的注意點(diǎn)
1.靜態(tài)內(nèi)部類可以通過(guò)對(duì)象訪問(wèn)內(nèi)部類的私有屬性
2.靜態(tài)內(nèi)部類可以直接訪問(wèn)外部類的靜態(tài)屬性和方法
3.外部類通過(guò)對(duì)象訪問(wèn)靜態(tài)內(nèi)部類中的私有屬性和方法
4.靜態(tài)內(nèi)部類中可以定義靜態(tài)變量也可以定義成員變量
3.產(chǎn)生靜態(tài)內(nèi)部類的對(duì)象
1.在外部類的內(nèi)部產(chǎn)生靜態(tài)內(nèi)部類
2.在外部類的外部產(chǎn)生靜態(tài)內(nèi)部類
四.成員內(nèi)部類和靜態(tài)內(nèi)部類的對(duì)比
1.實(shí)際案例
2.兩者差異
3.內(nèi)部類的作用
4.編譯后的class文件
五.方法內(nèi)部類
1.基本概念
2.方法內(nèi)部類的注意點(diǎn)
1.方法內(nèi)部類不能使用任何的訪問(wèn)修飾符
2.方法內(nèi)部類的聲明周期只在方法調(diào)用的過(guò)程中存在
3.方法內(nèi)部類中的訪問(wèn)范圍
4.方法內(nèi)部類形參不可改變
六.匿名內(nèi)部類
1.基本概念
2.匿名內(nèi)部類的示例
3.匿名內(nèi)部類的使用? ----參數(shù)使用匿名內(nèi)部類
一.內(nèi)部類
1.什么是內(nèi)部類
內(nèi)部類:一個(gè)類嵌套在另一個(gè)類的內(nèi)部,稱這個(gè)嵌套類為內(nèi)部類.
public class Outter {//內(nèi)部類class Inner{}
}
2.內(nèi)部類存在的原因
內(nèi)部類是封裝的一種體現(xiàn),
人類和心臟類的關(guān)系就是一種內(nèi)部類和外部類的關(guān)系
汽車發(fā)動(dòng)機(jī)和汽車關(guān)系也是一種內(nèi)部類和外部類的關(guān)系
3. 內(nèi)部類的分類
根據(jù)定義的位置和使用的關(guān)鍵字的不同,可以分為以下四種內(nèi)部類
- 成員內(nèi)部類
- 靜態(tài)內(nèi)部類
- 方法內(nèi)部類
- 匿名內(nèi)部類
4.內(nèi)部類的作用
- 內(nèi)外部類可以更方便的訪問(wèn)彼此的私有屬性
- 可以打破單繼承的局限
具體的表現(xiàn)在下面慢慢的具體分析
二.成員內(nèi)部類
1.基本概念
成員內(nèi)部類:直接定義在類中,不加static定義的內(nèi)部類就稱為成員內(nèi)部類
2.成員內(nèi)部類的注意點(diǎn)
提示:可以把成員內(nèi)部類類比為類中的成員方法
1.成員內(nèi)部類可以用private方法進(jìn)行修飾
我們都知道我們平常使用的類是不可以使用private關(guān)鍵字進(jìn)行修飾的,因?yàn)檫@樣在外部就無(wú)法訪問(wèn)到這個(gè)私有的類了,定義顯得沒(méi)有必要了.
但是成員內(nèi)部類是可以用private關(guān)鍵字修飾的,表示在外部無(wú)法直接創(chuàng)建私有的成員內(nèi)部類
public class Outter {private String name;//私有的內(nèi)部類private class Inner {}}
2.成員內(nèi)部類可以直接訪問(wèn)外部類的私有屬性
在內(nèi)部類Inner中,我們直接可以訪問(wèn)外部類的私有屬性和私有方法,直接調(diào)用,不需要?jiǎng)?chuàng)建對(duì)象,類比為成員方法直接調(diào)用類中的私有屬性和私有方法
直接調(diào)用的name相當(dāng)于Outter.this.name?
直接調(diào)用的fun()相當(dāng)于Outter.this.fun()
public class Outter {private String name;//內(nèi)部類private class Inner {private int num;private void test() {//直接在成員內(nèi)部類直接訪問(wèn)外部類的私有屬性System.out.println(name);fun();System.out.println("inner的test方法");}}private void fun() {System.out.println("外部類的fun方法");}}
3.外部類可以通過(guò)對(duì)象訪問(wèn)內(nèi)部類的私有屬性
外部類中是不可以直接訪問(wèn)內(nèi)部類的屬性和方法的,但是我們可以通過(guò)創(chuàng)建內(nèi)部類的對(duì)象來(lái)訪問(wèn)內(nèi)部類的私有屬性和方法.
如果是一個(gè)普通的類,內(nèi)部定義了私有的屬性和方法,我們即使創(chuàng)建了對(duì)象,也不可以訪問(wèn)內(nèi)部的私有屬性和方法,但是外部類中定義了內(nèi)部類的對(duì)象,我們是確實(shí)可以訪問(wèn)到內(nèi)部類的私有屬性和方法的
public class Outter {private String name;//內(nèi)部類private class Inner {private int num;private void test() {//直接在成員內(nèi)部類直接訪問(wèn)外部類的私有屬性System.out.println(name);System.out.println("inner的test方法");}}private void fun() {//產(chǎn)生內(nèi)部類的對(duì)象Inner inner = new Inner();//外部類中訪問(wèn)內(nèi)部類的屬性System.out.println(inner.num);inner.test();System.out.println("外部類的fun方法");}public static void main(String[] args) {Outter outter = new Outter();outter.fun();}
}
main方法的輸出
0
null
inner的test方法
外部類的fun方法
4.成員內(nèi)部類中不可以定義static屬性和方法
類比于成員方法,在成員方法中是不可以定義static的屬性的,因?yàn)榉椒ǖ恼{(diào)用需要對(duì)象來(lái)調(diào)用,而static的變量是不需要對(duì)象調(diào)用的,這顯然是矛盾的
?3.產(chǎn)生內(nèi)部類的對(duì)象
1.在外部類的內(nèi)部產(chǎn)生內(nèi)部類的對(duì)象
直接new出來(lái)內(nèi)部類的對(duì)象即可
類名稱 引用名稱=new 類名稱();
??????? Inner inner = new Inner();
2.在外部類的外部產(chǎn)生內(nèi)部類的對(duì)象
注意:如果成員內(nèi)部類私有(private),無(wú)法在內(nèi)部類的外部產(chǎn)生內(nèi)部類的對(duì)象
外部類名稱.內(nèi)部類名稱 內(nèi)部類引用=new 外部類名稱().new 內(nèi)部類名稱();
public class Test {public static void main(String[] args) {//在外部類的外部產(chǎn)生內(nèi)部類的對(duì)象Outter.Inner inner = new Outter().new Inner();}
}
類比于成員方法:成員方法必須通過(guò)類的對(duì)象調(diào)用
同理:要產(chǎn)生內(nèi)部類的對(duì)象,首先要產(chǎn)生外部類的對(duì)象
三.靜態(tài)內(nèi)部類
1.基本概念
靜態(tài)內(nèi)部類:直接定義在類的內(nèi)部,使用staic關(guān)鍵字修飾,就成為靜態(tài)內(nèi)部類
2.靜態(tài)內(nèi)部類的注意點(diǎn)
注意:可以把靜態(tài)內(nèi)部類類比于靜態(tài)方法
1.靜態(tài)內(nèi)部類可以通過(guò)對(duì)象訪問(wèn)內(nèi)部類的私有屬性
直接new外部類的對(duì)象,然后便可以訪問(wèn)其私有的屬性和方法
因?yàn)殪o態(tài)內(nèi)部類不需要依賴外部類的對(duì)象產(chǎn)生而產(chǎn)生,因此靜態(tài)內(nèi)部類中不能直接訪問(wèn)外部類的方法和屬性,必須通過(guò)外部類的對(duì)象來(lái)訪問(wèn),但是可以直接訪問(wèn)外部類的靜態(tài)屬性和方法
public class StaticOutter {private String name;static class inner {private int num;public void test() {//通過(guò)外部類的對(duì)象訪問(wèn)其私有屬性和方法StaticOutter staticOutter = new StaticOutter();staticOutter.fun();System.out.println(staticOutter.name);}}private void fun() {System.out.println("外部類的fun方法");}
}
2.靜態(tài)內(nèi)部類可以直接訪問(wèn)外部類的靜態(tài)屬性和方法
public class StaticOutter {private String name;static int age;static class inner {private int num;public void test() {//直接訪問(wèn)外部類的靜態(tài)屬性和方法System.out.println(age);method();//通過(guò)外部類的對(duì)象訪問(wèn)其私有屬性和方法StaticOutter staticOutter = new StaticOutter();staticOutter.fun();System.out.println(staticOutter.name);}}public static void method() {System.out.println("外部類的method方法");}private void fun() {System.out.println("外部類的fun方法");}
}
3.外部類通過(guò)對(duì)象訪問(wèn)靜態(tài)內(nèi)部類中的私有屬性和方法
和成員內(nèi)部類中的外部類訪問(wèn)內(nèi)部類一樣
public class StaticOutter {private String name;static int age;static class Inner {private int num;public void test() {//直接訪問(wèn)外部類的靜態(tài)屬性和方法System.out.println(age);method();//通過(guò)外部類的對(duì)象訪問(wèn)其私有屬性和方法StaticOutter staticOutter = new StaticOutter();staticOutter.fun();System.out.println(staticOutter.name);}}public static void method() {System.out.println("外部類的method方法");}private void fun() {//外部類通過(guò)對(duì)象訪問(wèn)靜態(tài)內(nèi)部類中的私有屬性和方法 Inner inner = new Inner();System.out.println(inner.num);System.out.println("外部類的fun方法");}
}
4.靜態(tài)內(nèi)部類中可以定義靜態(tài)變量也可以定義成員變量
靜態(tài)內(nèi)部類可以看做相當(dāng)于一個(gè)普通的類,只不過(guò)嵌套在了外部類的里面了而已
public class StaticOutter {private String name;static class Inner {private int num;static String address;public static void method(){System.out.println("靜態(tài)內(nèi)部類的靜態(tài)方法method");}public void test() {//通過(guò)外部類的對(duì)象訪問(wèn)其私有屬性和方法StaticOutter staticOutter = new StaticOutter();staticOutter.fun();System.out.println(staticOutter.name);}}private void fun() {//外部類通過(guò)對(duì)象訪問(wèn)靜態(tài)內(nèi)部類中的私有屬性和方法Inner inner = new Inner();System.out.println(inner.num);System.out.println("外部類的fun方法");}
}
3.產(chǎn)生靜態(tài)內(nèi)部類的對(duì)象
1.在外部類的內(nèi)部產(chǎn)生靜態(tài)內(nèi)部類
和成員內(nèi)部類一樣
類名稱 引用名稱=new 類名稱();
??????? Inner inner = new Inner();
2.在外部類的外部產(chǎn)生靜態(tài)內(nèi)部類
外部類名稱.內(nèi)部類名稱 內(nèi)部類引用=new 外部類名稱.內(nèi)部類名稱();
靜態(tài)內(nèi)部類不需要外部類的對(duì)象,因此不需要?jiǎng)?chuàng)建外部類的對(duì)象
public class Test {public static void main(String[] args) {//在外部類的外部產(chǎn)生靜態(tài)內(nèi)部類的對(duì)象StaticOutter.Inner inner = new StaticOutter.Inner();}
}
四.成員內(nèi)部類和靜態(tài)內(nèi)部類的對(duì)比
1.實(shí)際案例
成員內(nèi)部類和外部類相當(dāng)于人類和心臟,心臟的產(chǎn)生不能離開(kāi)人的產(chǎn)生
而靜態(tài)內(nèi)部類和外部類相當(dāng)于車和發(fā)動(dòng)機(jī),發(fā)動(dòng)機(jī)可以立刻車獨(dú)立存在
2.兩者差異
成員內(nèi)部類中包含了外部類的對(duì)象,能直接訪問(wèn)外部類的成員屬性,不能定義靜態(tài)屬性
靜態(tài)內(nèi)部類中沒(méi)有包含外部類的對(duì)象,不能直接訪問(wèn)外部類的成員屬性,能定義靜態(tài)屬性和成員屬性
3.內(nèi)部類的作用
1.經(jīng)過(guò)以上的分析,我們可以總結(jié)出內(nèi)部類的一大作用就是可以直接訪問(wèn)外部類的私有屬性和方法
2.我們知道一個(gè)子類只能繼承一個(gè)父類,我們?nèi)绻褂脙?nèi)部類,便可以寫(xiě)出類似多繼承的子類,規(guī)避單繼承的局限性,此時(shí)外部類中就包含了A和B的所有屬性和方法
class A {}class B {}public class InnerClassExtends {class InnerA extends A {}class InnerB extends B {}}
4.編譯后的class文件
Outter是外部類,Inner是內(nèi)部類,中間用$符分隔開(kāi)
五.方法內(nèi)部類
1.基本概念
方法內(nèi)部類:直接定義在方法中的類
2.方法內(nèi)部類的注意點(diǎn)
注意:方法內(nèi)部類可以類似于參數(shù)
1.方法內(nèi)部類不能使用任何的訪問(wèn)修飾符
public class MethodInner {private String name;public void fun() {//在方法中定義的類技術(shù)就是方法內(nèi)部類class Inner {}}
}
2.方法內(nèi)部類的聲明周期只在方法調(diào)用的過(guò)程中存在
方法調(diào)用結(jié)束之后自動(dòng)銷毀,方法內(nèi)部類對(duì)方法外部完全隱藏
public class MethodInner {private String name;public static void fun() {//在方法中定義的類技術(shù)就是方法內(nèi)部類class Inner {private int num;private void test() {//可以訪問(wèn)到外部類的私有System.out.println(new MethodInner().name);}}//可以通過(guò)對(duì)象訪問(wèn)到方法內(nèi)部類的私有屬性和方法//在這個(gè)方法之外無(wú)法new Inner對(duì)象Inner inner = new Inner();inner.test();System.out.println(inner.num);}
}
3.方法內(nèi)部類中的訪問(wèn)范圍
方法內(nèi)部類中的方法是否需要new外部類取決于外部方法是static還是普通的
public class MethodInner {private String name;public void fun() {//在方法中定義的類技術(shù)就是方法內(nèi)部類class Inner {private int num;public void test() {//可以訪問(wèn)到外部類的私有System.out.println(name);}}}
}
public class MethodInner {private String name;public static void fun() {//在方法中定義的類技術(shù)就是方法內(nèi)部類class Inner {private int num;public void test() {//可以訪問(wèn)到外部類的私有System.out.println(new MethodInner().name);}}}
}
4.方法內(nèi)部類形參不可改變
若方法內(nèi)部類使用方法的形參,這個(gè)參數(shù)必須為形式上的參數(shù)(不能在類中修改該參數(shù)的值,JDK8之后),JDK8之前必須顯式的定義為final
在方法內(nèi)部類中調(diào)用了方法的形參,在方法內(nèi)也不能改變其值;我們可以思考一下為什么.因?yàn)槿绻覀冊(cè)诜椒▋?nèi)部類中調(diào)用了方法的形參,而此時(shí)我們?cè)诜椒ㄖ行薷牧诵螀⒌闹?無(wú)法確定調(diào)用的形參的值是原始的,還是修改過(guò)后的形參的值
總結(jié):在方法內(nèi)部類中只能訪問(wèn)方法內(nèi)的參數(shù),不能修改其值
方法形參是否有final取決于方法形參中是否使用了形參
六.匿名內(nèi)部類
1.基本概念
匿名內(nèi)部類:定義在方法之中,主要是在方法的形參上使用,這個(gè)類沒(méi)有名字,一般默認(rèn)繼承一個(gè)類或者一個(gè)接口
2.匿名內(nèi)部類的示例
interface IMessage {void print();
}public class NonNameMethod {public void fun() {new IMessage() {@Overridepublic void print() {}};}
}
上邊的結(jié)構(gòu)相當(dāng)于這樣進(jìn)行轉(zhuǎn)換的
3.匿名內(nèi)部類的使用? ----參數(shù)使用匿名內(nèi)部類
public static void main(String[] args) {compare(new Comparator() {@Overridepublic int compare(Object o1, Object o2) {return 0;}});}public static void compare(Comparator c) {System.out.println("compare方法");}
上面的compare方法需要傳入一個(gè)接口對(duì)象,這個(gè)時(shí)候我們需要傳入一個(gè)接口的實(shí)現(xiàn)類,實(shí)現(xiàn)向上轉(zhuǎn)型,這個(gè)時(shí)候我們就需要使用匿名實(shí)現(xiàn)類了