JAVA內(nèi)部類示例詳解及練習(xí)
1 內(nèi)部類概述
如果一個類存在的意義就是為指定的另一個類,可以把這個類放入另一個類的內(nèi)部。
就是把類定義在類的內(nèi)部的情況就可以形成內(nèi)部類的形式。
A類中又定義了B類,B類就是內(nèi)部類,B類可以當(dāng)做A類的一個成員看待:
2 特點(diǎn)
1) 內(nèi)部類可以直接訪問外部類中的成員,包括私有成員
2) 外部類要訪問內(nèi)部類的成員,必須要建立內(nèi)部類的對象
3) 在成員位置的內(nèi)部類是成員內(nèi)部類
4) 在局部位置的內(nèi)部類是局部內(nèi)部類
3 練習(xí) : 內(nèi)部類入門案例
創(chuàng)建包: cn.tedu.innerclass
創(chuàng)建類: TestInner1.java
package cn.tedu.innerclass; /*本類用作測試內(nèi)部類的入門案例*/ public class TestInner1 { public static void main(String[] args) { //3.創(chuàng)建內(nèi)部類對象,使用內(nèi)部類的資源 /*外部類名.內(nèi)部類名 對象名 = 外部類對象.內(nèi)部類對象*/ Outer.Inner oi = new Outer().new Inner(); oi.delete(); System.out.println(oi.sum); //4.調(diào)用外部類的方法--這樣是創(chuàng)建了一個外部類的匿名對象,只使用一次 new Outer().find(); } } //1.創(chuàng)建外部類 Outer class Outer{ //1.1創(chuàng)建外部類的成員變量 String name; private int age; //1.2創(chuàng)建外部類的成員方法 public void find(){ System.out.println("Outer...find()"); //6.測試外部類如何使用內(nèi)部類的資源 //System.out.println(sum);--不能直接使用內(nèi)部類的屬性 //delete();--不能直接調(diào)用內(nèi)部類的方法 /*外部類如果想要使用內(nèi)部類的資源,必須先創(chuàng)建內(nèi)部類對象 * 通過內(nèi)部類對象來調(diào)用內(nèi)部類的資源*/ Inner in = new Inner(); System.out.println(in.sum); in.delete(); } //2.創(chuàng)建內(nèi)部類Inner--類的特殊成員 /*根據(jù)內(nèi)部類位置的不同,分為:成員內(nèi)部類(類里方法外)、局部內(nèi)部類(方法里)*/ class Inner{ //2.1定義內(nèi)部類的成員變量 int sum = 10; //2.2定義內(nèi)部類的成員方法 public void delete(){ System.out.println("Inner...delete()"); //5.測試內(nèi)部類是否可以使用外部類的資源 /*結(jié)論:內(nèi)部類可以直接使用外部類的資源,私有成員也可以!*/ System.out.println(name); System.out.println(age); /*注意:此處測試完畢需要注釋掉,否則來回調(diào)用 * 會拋出異常StackOverFlowException棧溢出異常*/ //find(); } } }
4 成員內(nèi)部類
4.1 練習(xí) : 被private修飾
創(chuàng)建包: cn.tedu.innerclass
創(chuàng)建類: TestInner2.java
package cn.tedu.innerclass; /**本類用來測試成員內(nèi)部類被private修飾*/ public class TestInner2 { public static void main(String[] args) { /**怎么使用內(nèi)部類Inner2的資源?*/ //4.創(chuàng)建內(nèi)部類Inner2對象進(jìn)行訪問 //Outer2.Inner2 oi = new Outer2().new Inner2(); //oi.eat(); /**如果Inner2被private修飾,無法直接創(chuàng)建對象該怎么辦?*/ //7.創(chuàng)建外部類對象,間接訪問私有內(nèi)部類資源 new Outer2().getInner2Eat(); } } //1.創(chuàng)建外部類Outer2 class Outer2{ //6.提供外部類公共的方法,在方法內(nèi)部創(chuàng)建Inner2內(nèi)部類對象,調(diào)用內(nèi)部類方法 public void getInner2Eat() { Inner2 in = new Inner2();//外部類可以訪問內(nèi)部類的私有成員 in.eat(); } //2.1創(chuàng)建成員內(nèi)部類Inner2 /**成員內(nèi)部類的位置:類里方法外*/ //5.成員內(nèi)部類,被private修飾私有化,無法被外界訪問 private class Inner2{ //3.創(chuàng)建內(nèi)部類的普通成員方法 public void eat() { System.out.println("我是Inner2的eat()"); } } }
總結(jié): 成員內(nèi)部類被Private修飾以后,無法被外界直接創(chuàng)建創(chuàng)建對象使用 所以可以創(chuàng)建外部類對象,通過外部類對象間接訪問內(nèi)部類的資源
4.2 練習(xí) : 被static修飾
創(chuàng)建包: cn.tedu.innerclass
創(chuàng)建類: TestInner3.java
package cn.tedu.innerclass; /**本類用來測試成員內(nèi)部類被static修飾*/ public class TestInner3 { public static void main(String[] args) { /**如何訪問內(nèi)部類的show()?*/ //4.創(chuàng)建內(nèi)部類對象訪問show() //方式一:按照之前的方式,創(chuàng)建內(nèi)部類對象調(diào)用show() //Outer3.Inner3 oi = new Outer3().new Inner3(); //oi.show(); //方式二:創(chuàng)建匿名內(nèi)部類對象訪問show() //new Outer3().new Inner3().show(); /**現(xiàn)象:當(dāng)內(nèi)部類被static修飾以后,new Outer3()報錯*/ //6.用static修飾內(nèi)部類以后,上面的創(chuàng)建語句報錯,注釋掉 //通過外部類的類名創(chuàng)建內(nèi)部類對象 Outer3.Inner3 oi = new Outer3.Inner3(); oi.show(); //7.匿名的內(nèi)部類對象調(diào)用show() new Outer3.Inner3().show(); //9.訪問靜態(tài)內(nèi)部類中的靜態(tài)資源--鏈?zhǔn)郊虞d Outer3.Inner3.show2(); } } //1.創(chuàng)建外部類Outer3 class Outer3{ //2.創(chuàng)建成員內(nèi)部類Inner3 //5.內(nèi)部類被static修飾—并不常用!浪費(fèi)內(nèi)存! static class Inner3{ //3.定義成員內(nèi)部類中普通的成員方法 public void show() { System.out.println("我是Inner3類的show()"); } //8.定義成員內(nèi)部類的靜態(tài)成員方法 static public void show2() { System.out.println("我是Inner3的show2()"); } } }
總結(jié): 靜態(tài)資源訪問時不需要創(chuàng)建對象,可以通過類名直接訪問 訪問靜態(tài)類中的靜態(tài)資源可以通過”. . . ”鏈?zhǔn)郊虞d的方式訪問
5 局部內(nèi)部類
創(chuàng)建包: cn.tedu.innerclass
創(chuàng)建類: TestInner4.java
package cn.tedu.innerclass; /**本類用來測試局部內(nèi)部類*/ public class TestInner4 { public static void main(String[] args) { /**如何使用內(nèi)部類的資源呢? * 注意:直接調(diào)用外部類的show()是無法觸發(fā)內(nèi)部類功能的 * 需要再外部類中創(chuàng)建內(nèi)部類對象并且進(jìn)行調(diào)用,才能觸發(fā)內(nèi)部類的功能 * */ //5.創(chuàng)建外部類對象調(diào)用show() //7.當(dāng)在外部類show()中創(chuàng)建局部內(nèi)部類對象并且進(jìn)行功能調(diào)用后,內(nèi)部類的功能才能被調(diào)用 new Outer4().show(); } } //1.創(chuàng)建外部類Outer4 class Outer4{ //2.創(chuàng)建外部類的成員方法 public void show() { //3.創(chuàng)建局部內(nèi)部類Inner4—不太常用!!! /**位置:局部內(nèi)部類的位置在方法里*/ class Inner4{ //4.創(chuàng)建局部內(nèi)部類的普通屬性與方法 String name; int age; public void eat() { System.out.println("我是Inner4的eat()"); } } /**如何使用局部內(nèi)部類的資源?*/ //6.在show()里創(chuàng)建內(nèi)部類對象 Inner4 in = new Inner4(); in.eat(); System.out.println(in.name); System.out.println(in.age); } }
6 匿名內(nèi)部類
創(chuàng)建包: cn.tedu.innerclass
創(chuàng)建類: TestInner5.java
package cn.tedu.innerclass; /*本類用于測試匿名內(nèi)部類 * 匿名內(nèi)部類沒有名字,通常與匿名對象結(jié)合在一起使用*/ public class TestInner5 { public static void main(String[] args) { //傳統(tǒng)方式:創(chuàng)建接口的實(shí)現(xiàn)類+實(shí)現(xiàn)類實(shí)現(xiàn)接口中的抽象方法+創(chuàng)建實(shí)現(xiàn)類對象+通過對象調(diào)用方法 //3.創(chuàng)建接口一對應(yīng)的匿名對象與匿名內(nèi)部類,并調(diào)用實(shí)現(xiàn)了的方法save() new Inter1(){ @Override public void save() { System.out.println("save()..."); } @Override public void get() { } }.save(); //5.創(chuàng)建抽象類對應(yīng)的匿名對象與匿名內(nèi)部類 new Inter2(){ @Override public void drink() { System.out.println("一人飲酒醉"); } }.drink(); //7.調(diào)用普通類的功能怎么調(diào)用?創(chuàng)建匿名對象直接調(diào)用 new Inter3().powerUp(); new Inter3().powerUp();//new了2次,所以是兩個匿名對象 /*如果想要多次使用實(shí)現(xiàn)后的功能,還是要創(chuàng)建普通的對象 * 匿名對象只能使用一次,一次只能調(diào)用一個功能 * 匿名內(nèi)部類其實(shí)就充當(dāng)了實(shí)現(xiàn)類的角色,去實(shí)現(xiàn)未實(shí)現(xiàn)的抽象方法,只是沒有名字而已*/ Inter3 in = new Inter3(); in.study(); in.study(); in.study(); in.study(); in.study(); in.study(); } } //1.創(chuàng)建接口 interface Inter1{ //2.定義接口中的抽象方法 void save(); void get(); } //4.創(chuàng)建抽象類 abstract class Inter2{ public void play(){ System.out.println("Inter2...play()"); } abstract public void drink(); } //6.創(chuàng)建普通類 class Inter3{ public void study(){ System.out.println("什么都阻擋不了我想學(xué)習(xí)賺錢的決心"); } public void powerUp(){ System.out.println("我們會越來越強(qiáng)的!"); } }
總結(jié): 匿名內(nèi)部類屬于局部內(nèi)部類,而且是沒有名字的局部內(nèi)部類,通常和匿名對象一起使用
以上就是JAVA內(nèi)部類示例詳解及練習(xí)的詳細(xì)內(nèi)容,更多關(guān)于Java內(nèi)部類的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
關(guān)于SpringBoot大文件RestTemplate下載解決方案
這篇文章主要介紹了SpringBoot大文件RestTemplate下載解決方案,最近結(jié)合網(wǎng)上案例及自己總結(jié),寫了一個分片下載tuling/fileServer項(xiàng)目,需要的朋友可以參考下2021-10-10使用Java代碼進(jìn)行因數(shù)分解和求最小公倍數(shù)的示例
這篇文章主要介紹了使用Java代碼進(jìn)行因數(shù)分解和求最小公倍數(shù)的示例,都是基于最基礎(chǔ)的算法原理實(shí)現(xiàn),需要的朋友可以參考下2015-11-11Java中使用BeanMap將對象轉(zhuǎn)為Map詳解
這篇文章主要介紹了Java中使用BeanMap將對象轉(zhuǎn)為Map詳解,BeanMap?是?Apache?Commons?BeanUtils?庫中的一個類,BeanMap?可以將?Java?對象的屬性作為鍵,屬性值作為對應(yīng)的值,存儲在一個?Map?中,它提供了一種將?Java?對象轉(zhuǎn)換為?Map?的方式,需要的朋友可以參考下2024-01-01maven為MANIFEST.MF文件添加內(nèi)容的方法
這篇文章主要介紹了maven為MANIFEST.MF文件添加內(nèi)容的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12Mybatis-plus獲取雪花算法生成的ID并返回生成ID
本文主要介紹了Mybatis-plus獲取雪花算法生成的ID并返回生成ID,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09clickhouse?批量插入數(shù)據(jù)及ClickHouse常用命令詳解
這篇文章主要介紹了clickhouse?批量插入數(shù)據(jù)及ClickHouse常用命令,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03SpringMVC與Mybatis集合實(shí)現(xiàn)調(diào)用存儲過程、事務(wù)控制實(shí)例
這篇文章主要介紹了SpringMVC與Mybatis集合實(shí)現(xiàn)調(diào)用存儲過程、事務(wù)控制實(shí)例,有需要的可以了解一下。2016-11-11DTO 實(shí)現(xiàn) service 和 controller 之間值傳遞的操作
這篇文章主要介紹了DTO 實(shí)現(xiàn) service 和 controller 之間值傳遞的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02