JAVA 內(nèi)部類詳解及實(shí)例
JAVA 內(nèi)部類
一、什么是內(nèi)部類?
一個(gè)類的定義放在另一個(gè)類的內(nèi)部,這個(gè)類就叫做內(nèi)部類
二、內(nèi)部類有那些特性?
1、內(nèi)部類仍然是一個(gè)獨(dú)立的類,在編譯之后內(nèi)部類會(huì)被編譯成獨(dú)立的.class文件,但是前面冠以外部類的類名和$符號(hào) 。
2、內(nèi)部類不能用普通的方式訪問。內(nèi)部類是外部類的一個(gè)成員,因此內(nèi)部類可以自由地訪問外部類的成員變量,無論是否是private的 。
3、內(nèi)部類聲明成靜態(tài)的,就不能隨便的訪問外部類的成員變量了,此時(shí)內(nèi)部類只能訪問外部類的靜態(tài)成員變量 。
三、內(nèi)部類有哪幾種?
1.成員內(nèi)部類
如:
package com.test01; public class A { // 內(nèi)部類 B 繼承 TestPojo 和實(shí)現(xiàn) TestInterface 接口 class B extends TestPojo implements TestInterface{ //內(nèi)部類 B 自己的方法 public void run(){ System.out.println("我正在跑!"); } //重寫的接口方法 public void testf() { System.out.println("實(shí)現(xiàn)接口!"); } } // 方法里面調(diào)用內(nèi)部類 public void test(){ B b = new B() ; b.testf() ; // 掉用重寫接口方法 b.run() ; // 調(diào)用自己的方法 b.testpojo() ; // 調(diào)用繼承父類的方法 } // main 方法測(cè)試 public static void main(String[] args) { A a = new A() ; a.test() ; } } // 定義了一個(gè)接口 ,方法為testf() interface TestInterface{ public void testf() ; } // 定義了一個(gè)普通類 方法testpojo() class TestPojo{ public void testpojo(){ System.out.println("我是簡(jiǎn)單的pojo類"); } } // 實(shí)現(xiàn) 調(diào)用內(nèi)部類里面的方法 class Textone{ public static void main(String[] args) { A.B b = new A().new B() ; //調(diào)用類A里面的內(nèi)部類B /** 等同于 下面代碼 * A a = new A() ; * A.B b = a.new B() ; * */ b.testf() ; // 掉用重寫接口方法 b.run() ; // 調(diào)用自己的方法 b.testpojo() ; // 調(diào)用繼承父類的方法 } }
2、方法內(nèi)部類
package com.test01; public class PerTest { public void test(){ // 定義一個(gè)方法 class Ne{ // 定義一個(gè)方法內(nèi)部類 public void fle(){ // 定義方法內(nèi)部類的方法 System.out.println("我正在飛翔!"); } } ; new Ne().fle() ; //調(diào)用內(nèi)部類的方法 } public static void main(String[] args) { new PerTest().test() ; //測(cè)試 } }
注意: (1)、方法內(nèi)部類只能在定義該內(nèi)部類的方法內(nèi)實(shí)例化,不可以在此方法外對(duì)其實(shí)例化。
(2)、方法內(nèi)部類對(duì)象不能使用該內(nèi)部類所在方法的非final局部變量?! ?/p>
因?yàn)榉椒ǖ木植孔兞课挥跅I?,只存在于該方法的生命期?nèi)。當(dāng)一個(gè)方法結(jié)束,其棧結(jié)構(gòu)被刪除,
局部變量成為歷史。但是該方法結(jié)束之后,在方法內(nèi)創(chuàng)建的內(nèi)部類對(duì)象可能仍然存在于堆中!
例如,如果對(duì)它的引用被傳遞到其他某些代碼,并存儲(chǔ)在一個(gè)成員變量?jī)?nèi)。正因?yàn)椴荒鼙WC局部變
量的存活期和方法內(nèi)部類對(duì)象的一樣長(zhǎng),所以內(nèi)部類對(duì)象不能使用它們。 (該理解來源于百度百科)
3、匿名內(nèi)部類
1)、抽象匿名內(nèi)部類
package com.anonymous; public class AbstractClass { public void test(){ //方法為test TestA a = new TestA(){ //實(shí)現(xiàn)抽象類 @Override public void run() { //實(shí)現(xiàn)抽象類的方法 System.out.println("我正在使用抽象匿名內(nèi)部類"); } } ; a.run() ; //調(diào)用內(nèi)部類的方法 } public static void main(String[] args) { new AbstractClass().test() ; //測(cè)試 } } //定義一個(gè)抽象類 TestA 抽象方法為run() abstract class TestA{ public abstract void run() ; }
2)、接口匿名內(nèi)部類
package com.anonymous; public class TestAnonymous { MyInterface m = new MyInterface(){ //實(shí)現(xiàn)接口 public void eat() { //重寫MyInterface 接口方法 System.out.println("我正在吃飯!"); } } ; public void ss(){ //方法ss m.eat() ; //調(diào)用重寫的方法 } public static void main(String[] args) { new TestAnonymous().ss() ; //測(cè)試 } } //定義一個(gè)接口 方法為 eat interface MyInterface{ public void eat() ; }
注意:匿名內(nèi)部 類 可以定義在方法內(nèi)也可以定義在類的成員中,不管是那種匿名內(nèi)部類都不能被外部類直接調(diào)用
四、內(nèi)部類的作用?
每個(gè)內(nèi)部類都能獨(dú)立地繼承自一個(gè)(接口的)實(shí)現(xiàn),所以無論外圍類是否已經(jīng)繼承了某個(gè)(接口的)實(shí)現(xiàn),對(duì)于內(nèi)部類都沒有影響。如果沒有內(nèi)部類提供的可以繼承多個(gè)具體的或抽象的類的能力,一些設(shè)計(jì)與編程問題就很難解決。從這個(gè)角度看,內(nèi)部類使得多重繼承的解決方案變得完整。
接口解決了部分問題,而內(nèi)部類有效地實(shí)現(xiàn)了“多重繼承”。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Spring boot + mybatis + orcale實(shí)現(xiàn)步驟實(shí)例代碼講解
這篇文章主要介紹了Spring boot + mybatis + orcale的實(shí)現(xiàn)步驟實(shí)例代碼講解,需要的朋友可以參考下2017-12-12MyBatis 實(shí)現(xiàn)批量插入和刪除中雙層循環(huán)的寫法案例
這篇文章主要介紹了MyBatis 實(shí)現(xiàn)批量插入和刪除中雙層循環(huán)的寫法案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01雙token實(shí)現(xiàn)token超時(shí)策略示例
用于restful的app應(yīng)用無狀態(tài)無sesion登錄示例,需要的朋友可以參考下2014-02-02詳解Java中方法重寫與重載的區(qū)別(面試高頻問點(diǎn))
這篇文章主要介紹了Java中方法重寫與重載的區(qū)別(面試高頻問點(diǎn)),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03