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)部類可以自由地訪問外部類的成員變量,無(wú)論是否是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ì)象不能使用它們。 (該理解來(lái)源于百度百科)
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),所以無(wú)論外圍類是否已經(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)文章
利用Java代碼實(shí)現(xiàn)區(qū)塊鏈技術(shù)
這篇文章主要介紹了利用Java代碼實(shí)現(xiàn)區(qū)塊鏈技術(shù),區(qū)塊鏈的應(yīng)用范圍幾乎無(wú)窮無(wú)盡,關(guān)于區(qū)塊鏈?zhǔn)侨绾芜\(yùn)作的,下文來(lái)看看具體的內(nèi)容介紹吧,需要的朋友可以參考一下2022-04-04
JAVA參數(shù)傳遞方式實(shí)例淺析【按值傳遞與引用傳遞區(qū)別】
這篇文章主要介紹了JAVA參數(shù)傳遞方式,結(jié)合實(shí)例形式分析了java按值傳遞與引用傳遞區(qū)別及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2020-05-05
Spring中的事務(wù)管理及實(shí)現(xiàn)方式解析
這篇文章主要介紹了Spring中的事務(wù)管理及實(shí)現(xiàn)方式解析,Spring事務(wù)管理基于底層數(shù)據(jù)庫(kù)本身的事務(wù)處理機(jī)制,數(shù)據(jù)庫(kù)事務(wù)的基礎(chǔ),是掌握Spring事務(wù)管理的基礎(chǔ),這篇總結(jié)下Spring事務(wù),需要的朋友可以參考下2024-01-01
解決MyEclipse中Maven設(shè)置jdk版本jdk1.8報(bào)錯(cuò)問題
今天安裝了jdk1.8、tomcat8、和maven3.5.2,弄好后在myeclipse新建了一個(gè)maven項(xiàng)目,項(xiàng)目默認(rèn)是jdk1.5,改成jdk1.8后項(xiàng)目報(bào)錯(cuò)2018-10-10
Spring boot中使用ElasticSearch的方法詳解
這篇文章主要給大家介紹了關(guān)于Spring boot中使用ElasticSearch的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01
簡(jiǎn)單易懂的MyBatis分庫(kù)分表方案分享
這篇文章主要給大家介紹了關(guān)于MyBatis分庫(kù)分表方案的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用MyBatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03

