詳解Java內(nèi)部類與對象的打印概念和流程
一、內(nèi)部類的概念
在 Java 中,可以將一個類定義在另一個類或者一個方法的內(nèi)部,前者稱為內(nèi)部類,后者稱為外部類。內(nèi)部類也是封裝的一種體現(xiàn)。
public class OutClass {//外部類 class InnerClass{//內(nèi)部類 } }
注意事項(xiàng):
1、內(nèi)部類一定是定義在class 類名{}之中的類,定義在class 類名{}之外的,哪怕是在一份文件中,也并不能稱為內(nèi)部類。例如:
public class A{ } class B{ } //A和B兩個類是獨(dú)立的,無內(nèi)外部類一說
2、內(nèi)部類和外部類共用同一個java源文件,但是經(jīng)過編譯之后,內(nèi)部類會形成單獨(dú)的字節(jié)碼文件。
二、內(nèi)部類的分類
public class OutClass { //普通內(nèi)部類 class InnerClass1{ } //靜態(tài)內(nèi)部類 static class InnerClass2{ } { //定義在實(shí)例代碼塊中的 局部內(nèi)部類 class InnerClass3{ } } static{ //定義在靜態(tài)代碼塊中的 局部內(nèi)部類 class InnerClass4{ } } public void method(){ //定義在方法中的 局部內(nèi)部類 class InnerClass5{ } { //方法中的普通代碼塊中也可以定義局部內(nèi)部類 class InnerClass6{ } } } }
根據(jù)內(nèi)部類定義的位置不同,可以分為:
成員內(nèi)部類:普通內(nèi)部類和靜態(tài)內(nèi)部類。
局部內(nèi)部類和匿名內(nèi)部類。
三、成員內(nèi)部類
1、普通內(nèi)部類
未被static修飾的成員內(nèi)部類。
public class OutClass {//外部類 private int a; private int b; private int c; public void method1(){ a=100; System.out.println(a); } public void method2(){ System.out.println(b); } class InnerClass{ //普通內(nèi)部類 private int c; //與外部類成員變量名稱相同的內(nèi)部成員變量 public void methodInner() { //在內(nèi)部類中可以直接訪問外部類任意限定符的成員變量和方法 b = 150; method1(); method2(); //在訪問與外部類成員名稱相同的成員時(shí),優(yōu)先訪問內(nèi)部類自己的成員 c = 300; System.out.println(c); //要訪問外部類中的同名成員必須使用——— 外部類名.this.成員名 來訪問 OutClass.this.c = 400; System.out.println(OutClass.this.c); } } public static void main(String[] args) { //創(chuàng)建內(nèi)部類對象 OutClass.InnerClass innerclass1=new OutClass().new InnerClass(); //也可以先創(chuàng)建外部類對象,再創(chuàng)建內(nèi)部類對象 OutClass outclass=new OutClass(); //注意當(dāng)在不同文件中創(chuàng)建其內(nèi)部類對象一定需要加上該內(nèi)部類的外部類名,同一文件下可加可不加 OutClass.InnerClass innerclass2=outclass.new InnerClass(); innerclass2.methodInner(); } }
/*
100
150
300
400
*/
注意事項(xiàng):
1、普通內(nèi)部類中可以直接訪問外部類中的所有方法。
2、普通內(nèi)部類成員的位置與外部類成員位置相同,都受public,private等限定符的限制。
3、在普通內(nèi)部類方法中訪問同名的成員時(shí),優(yōu)先訪問自己的,如果要訪問外部類同名的成員,必須:外部類名稱.this.同名成員 來訪問。
4、要創(chuàng)建普通內(nèi)部類對象,要先創(chuàng)建外部類的對象。在創(chuàng)建內(nèi)部類對象時(shí),如果該內(nèi)部類在當(dāng)前文件,則在創(chuàng)建對象語句最前面不需要外部類名,如果在不同文件,那么一定要指明該內(nèi)部類的外部類名。
5、 普通內(nèi)部類中包含了一個指向外部類對象的引用。
6、外部類中,不能直接訪問內(nèi)部類中的成員,如果要訪問必須先要創(chuàng)建內(nèi)部類的對象。
public class OutClass1 { private int a; public void method(){ System.out.println(c); //在外部類中直接訪問內(nèi)部類成員,編譯報(bào)錯 } class InnerClass{ private int c; } }
public class OutClass1 { private int a; public void methodOut(){ InnerClass I2=new InnerClass();//在外部類方法中創(chuàng)建內(nèi)部類對象可以直接創(chuàng)建 System.out.println(I2.c); } class InnerClass{ private int c; } }
從堆和棧的角度來看內(nèi)部類和外部類:
2、靜態(tài)內(nèi)部類
被static修飾的成員內(nèi)部類稱為靜態(tài)內(nèi)部類。
public class OutClass {//外部類 private int a; static int b; //靜態(tài)變量 public void method1(){ } public static void method2(){ //靜態(tài)方法 } static class InnerClass{ //靜態(tài)內(nèi)部類 public void methodInner() { //在靜態(tài)內(nèi)部類中只能訪問外部類的靜態(tài)成員和方法 // a=100;編譯失敗,a不是外部類的成員變量 b = 150; // method1();編譯失敗,method1不是外部類的成員方法 method2(); } } public static void main(String[] args) { //靜態(tài)內(nèi)部類的創(chuàng)建 InnerClass innerclass=new InnerClass(); //成員訪問 innerclass.methodInner(); } }
注意事項(xiàng):
1、在內(nèi)部類中只能訪問外部類中的靜態(tài)成員。
2、創(chuàng)建靜態(tài)內(nèi)部類對象時(shí),不需要先創(chuàng)建外部類對象。
3、成員內(nèi)部類,經(jīng)過編譯之后會生成自己獨(dú)立的字節(jié)碼文件,例如下:
四、局部內(nèi)部類
定義在外部類的方法體或者{}中,該種內(nèi)部類只能在其定義的位置使用。
public class OutClass {//外部類 int a=10; public void method(){ //外部類方法 int b=10; class InnerClass{ //局部內(nèi)部類,只能在該方法體內(nèi)部使用 public void methodInnerClass(){ System.out.println(a); System.out.println(b); } } InnerClass innerclass=new InnerClass(); innerclass.methodInnerClass(); } public static void main(String[] args) { //InnerClass innerclass=null; 編譯失敗 } }
注意事項(xiàng):
1、局部內(nèi)部類只能在所定義的方法體內(nèi)部使用。
2、局部內(nèi)部類不能被public、static等限定符修飾。
3、同樣編譯之后局部內(nèi)部類會生成自己的字節(jié)碼文件。
命名格式:外部類名$x內(nèi)部類名.class, 其中x是一個整數(shù)。
五、對象的打印
public class Person { String name; String gender; int age; public Person(String name,String gender,int age){ this.name=name; this.gender=gender; this.age=age; } public static void main(String[] args) { Person person=new Person("luka","man",21); System.out.println(person); } }
打印結(jié)果: 并不是對象本身。
如果想要打印對象本身,那么需要重寫toString方法。
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
public String toString() { //重寫了toString方法 return "[" + name + "," + gender + "," + age + "]"; }
public class Person { String name; String gender; int age; public Person(String name,String gender,int age){ this.name=name; this.gender=gender; this.age=age; } public String toString() { //重寫了toString方法 return "[" + name + "," + gender + "," + age + "]"; } public static void main(String[] args) { Person person=new Person("luka","man",21); System.out.println(person); } }
/*
執(zhí)行結(jié)果:
[luka,man,21]
*/
到此這篇關(guān)于詳解Java內(nèi)部類與對象的打印概念和流程的文章就介紹到這了,更多相關(guān)Java 內(nèi)部類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
selenium+java破解極驗(yàn)滑動驗(yàn)證碼的示例代碼
本篇文章主要介紹了selenium+java破解極驗(yàn)滑動驗(yàn)證碼的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01Map按單個或多個Value排序當(dāng)Value相同時(shí)按Key排序
Map可以先按照value進(jìn)行排序,然后按照key進(jìn)行排序。 或者先按照key進(jìn)行排序,然后按照value進(jìn)行排序,這樣操作都行,這篇文章主要介紹了Map按單個或多個Value排序,當(dāng)Value相同時(shí)按Key排序,需要的朋友可以參考下2023-02-02java注釋轉(zhuǎn)json插件開發(fā)實(shí)戰(zhàn)詳解
這篇文章主要為大家介紹了java注釋轉(zhuǎn)json插件開發(fā)實(shí)戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06spring AOP定義AfterThrowing增加處理實(shí)例分析
這篇文章主要介紹了spring AOP定義AfterThrowing增加處理,結(jié)合實(shí)例形式分析了spring面向切面AOP定義AfterThrowing相關(guān)實(shí)現(xiàn)步驟與操作技巧,需要的朋友可以參考下2020-01-01永久解決 Intellij idea 報(bào)錯:Error :java 不支持發(fā)行版本5的問題
這篇文章主要介紹了永久解決 Intellij idea 報(bào)錯:Error :java 不支持發(fā)行版本5的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02關(guān)于Java for循環(huán)的正確用法介紹
Java里的循環(huán)結(jié)構(gòu)我們可以通過while、do-while、for、foreach等方式實(shí)現(xiàn)循環(huán),這篇文章會把這幾種循環(huán)方式都給大家講解到,但本文主要介紹for循環(huán)的使用,感興趣的同學(xué)可以參考閱讀2023-05-05