您好,登錄后才能下訂單哦!
這篇文章主要介紹“什么是Java的內(nèi)部類”,在日常操作中,相信很多人在什么是Java的內(nèi)部類問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”什么是Java的內(nèi)部類”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
Java的內(nèi)部類
成員內(nèi)部類
靜態(tài)內(nèi)部類
局部內(nèi)部類
概念:
內(nèi)部類就是在一個(gè)類的內(nèi)部定義一個(gè)類,比如,A類中定義一個(gè)B類,那么B類相對(duì)于A類來說就是稱為內(nèi)部類,而A類相對(duì)于B類來說就是外部類。
成員內(nèi)部類
靜態(tài)內(nèi)部類
局部內(nèi)部類
匿名內(nèi)部類
特點(diǎn):
內(nèi)部類編譯之后可以生成獨(dú)立的字節(jié)碼文件。
內(nèi)部類可以直接訪問外部類的私有成員,而不破壞封裝。
內(nèi)部類可為外部類提供必要的內(nèi)部功能組件。
外部類要訪問內(nèi)部類的成員,必須要建立內(nèi)部類的對(duì)象
在內(nèi)的內(nèi)部定義,與實(shí)例變量、實(shí)例方法同級(jí)別的類。
成員內(nèi)部類中不能包含靜態(tài)成員,但可以包含靜態(tài)常量。
package com.cnblogs; //這個(gè)類用于實(shí)現(xiàn) public class Application { public static void main(String[] args) { Outer outer = new Outer();//實(shí)例化 外部類 Outer.Inner inner = outer.new Inner();//實(shí)例化 內(nèi)部類 //一步到位實(shí)例化內(nèi)部類 //Inner inner = new Outer().new Inner(); //外部類的屬性 System.out.println(outer.age);//21 //外部類方法 outer.out1();//這是外部類的方法 //內(nèi)部類屬性 System.out.println(inner.in);//內(nèi)部類屬性 //內(nèi)部類方法 inner.inner();//這是內(nèi)部類方法 //內(nèi)部類獲取外部類的私有屬性 inner.getName();//獲取到了外部類的私有屬性:柒 //內(nèi)部類獲取外部類的私有方法 inner.getMethod();//這是外部類的私有方法 } }
package com.cnblogs; /* * 本類用于測試內(nèi)部類可以直接訪問外部類的私有成員 */ public class Outer { //外部類的私有屬性 private String name = "柒"; //外部類的屬性 public int age = 21; //外部類的私有方法 private void out() { System.out.println("這是外部類的私有方法"); } //外部類的方法 public void out1() { System.out.println("這是外部類的方法"); } class Inner{ //內(nèi)部類屬性 public String in = "內(nèi)部類屬性"; //內(nèi)部類方法 public void inner() { System.out.println("這是內(nèi)部類方法"); } //獲取外部類的私有屬性 public void getName() { System.out.println("獲取到了外部類的私有屬性:" + name); } //獲取外部類的私有方法 public void getMethod() { out(); } } }
注意:當(dāng)外部類、內(nèi)部類存在重名屬性時(shí),會(huì)優(yōu)先訪問內(nèi)部類屬性
package com.cnblogs; import com.cnblogs.Outer.Inner; /* * 本類用于實(shí)現(xiàn) */ public class Application { public static void main(String[] args) { Inner inner = new Outer().new Inner(); inner.show(); } }
package com.cnblogs; /* * 本類用于測試內(nèi)部類和外部類的同名屬性 */ public class Outer { //外部類屬性 private String name = "張三"; class Inner{ //內(nèi)部類屬性 private String name = "柒"; //內(nèi)部類方法,用于打印 public void show() { //這里打印出的是內(nèi)部類的屬性:柒 System.out.println(name); //這是打印外部類的屬性:張三 System.out.println(Outer.this.name); } } }
不依賴外部類對(duì)象,可直接創(chuàng)建或通過類名訪問,可聲明靜態(tài)成員
package com.cnblogs; import com.cnblogs.Outer2.Inner; /* * 本類用于實(shí)現(xiàn) */ public class Application { public static void main(String[] args) { //直接創(chuàng)建內(nèi)部類對(duì)象 Inner inner = new Outer2.Inner(); //調(diào)用方法 inner.show(); } }
package com.cnblogs; /* * 本類用于測速靜態(tài)內(nèi)部類 */ //外部類 public class Outer2 { private String name = "柒"; private int age = 21; //靜態(tài)內(nèi)部類 用法和外部類一樣 static class Inner{ private String in = "靜態(tài)內(nèi)部類屬性"; private int inner = 99; //靜態(tài)成員 private static int inners = 999; //調(diào)用方法 public void show() { //調(diào)用外部類屬性,先創(chuàng)建外部類對(duì)象 Outer2 outer = new Outer2(); //再調(diào)用外部類屬性 System.out.println(outer.name);//柒 System.out.println(outer.age);//21 //調(diào)用靜態(tài)內(nèi)部類屬性 System.out.println(in);//靜態(tài)內(nèi)部類屬性 System.out.println(inner);//99 //調(diào)用靜態(tài)內(nèi)部類的靜態(tài)成員 System.out.println(inners);//999 System.out.println(Inner.inners);//999 } } }
定義在外部類方法中,作用范圍和創(chuàng)建對(duì)象范圍僅限于當(dāng)前方法。
局部內(nèi)部類訪問外部類當(dāng)前方法中的局部變量時(shí),因無法保障變量的生命周期與自身相同,變量必須修飾為final。
限制類的使用范圍。
package com.cnblogs; //這個(gè)類用于實(shí)現(xiàn) public class Application { public static void main(String[] args) { Outer3 outer = new Outer3(); outer.show(); } }
package com.cnblogs; /* * 本類用于測試局部內(nèi)部類 */ //外部類 public class Outer3 { private String name = "柒"; private int age = 21; public void show() { //定義局部變量 String in = "蘇州"; //局部內(nèi)部類:不能加任何訪問修飾符 class Inner{ //局部內(nèi)部類的屬性 private String phone = "10086"; //局部內(nèi)部類方法 public void show2() { //訪問外部類屬性 System.out.println(name);//Outer3.this.name System.out.println(age); //訪問內(nèi)部類屬性 System.out.println(phone);//this.phone //訪問局部變量:jdk1.7要求 變量必須是常量final,jdk1.8自動(dòng)添加final System.out.println(in); } } //創(chuàng)建內(nèi)部類對(duì)象 Inner inner = new Inner(); inner.show2(); } }
匿名內(nèi)部類
沒有類名的局部內(nèi)部類(一切特征都與內(nèi)部類相同)。
必須繼承一個(gè)父類或者實(shí)現(xiàn)一個(gè)接口。
定義類、實(shí)現(xiàn)類、創(chuàng)建對(duì)象的語法合并,只能創(chuàng)建一個(gè)該類的對(duì)象。
優(yōu)點(diǎn):減少代碼量
缺點(diǎn):可讀性較差
package com.cnblogs; /* * 本類用于實(shí)現(xiàn)局部內(nèi)部類 */ public class TestUsb { public static void main(String[] args) { //創(chuàng)建接口類型的變量 // Usb usb = new Mouse(); // usb.service(); //局部內(nèi)部類 // class Fan implements Usb{ // // @Override // public void service() { // System.out.println("鏈接成功,可以使用?。。?!"); // // } // // } //使用局部內(nèi)部類創(chuàng)建對(duì)象 // Usb usb = new Fan(); // usb.service(); //使用匿名內(nèi)部類優(yōu)化(相當(dāng)于創(chuàng)建了一個(gè)局部內(nèi)部類) Usb usb = new Usb() { @Override public void service() { System.out.println("鏈接成功,可以使用!?。?!"); } }; usb.service(); } }
package com.cnblogs; //接口 public interface Usb { //服務(wù) void service(); }
package com.cnblogs; //實(shí)現(xiàn)接口 public class Mouse implements Usb{ @Override public void service() { System.out.println("鏈接成功,可以使用!?。。。?quot;); } }
到此,關(guān)于“什么是Java的內(nèi)部類”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。