java外部類(lèi)與內(nèi)部類(lèi)的關(guān)系詳解
?private,public,protected,default的訪問(wèn)權(quán)限區(qū)別
在學(xué)習(xí)外部類(lèi)與內(nèi)部類(lèi)之前我們首先要弄明白private,public,protected,default在訪問(wèn)權(quán)限上有什么不同,這對(duì)我們之后的理解會(huì)有一定的幫助。
- 1、private:訪問(wèn)權(quán)限最低的訪問(wèn)控制符,被它修飾的變量只能訪問(wèn)本類(lèi)的對(duì)象。
- 2、public:訪問(wèn)權(quán)限最高,不僅是本類(lèi),子類(lèi),本包,其他的包,都可以去訪問(wèn)它修飾的對(duì)象。
- 3、default:訪問(wèn)權(quán)限限制在本類(lèi)以及本包內(nèi)。
- 4、protected:訪問(wèn)的范圍是本類(lèi),本包內(nèi),子類(lèi),但別的包不可以訪問(wèn)。
外部類(lèi)訪問(wèn)內(nèi)部類(lèi)
在外部類(lèi)的main方法中創(chuàng)建了外部類(lèi)的對(duì)象,并通過(guò)它創(chuàng)建了內(nèi)部類(lèi)的對(duì)象,并調(diào)用了內(nèi)部類(lèi)的方法,這里我們觀察調(diào)用時(shí),age變量的變化。
public class People { private String name; private int age=20; private int ID ; public static void main(String[] args){ People p = new People(); People.Student s = p.new Student(); s.study(); } class Student { private String name; private int age=18; private int studentNumber; public void study(){ System.out.println("輸出age"+age); System.out.println("內(nèi)部類(lèi)變量"+this.age); System.out.println("外部類(lèi)變量"+People.this.age); } } }
輸出結(jié)果:
輸出age18、內(nèi)部類(lèi)變量18、外部類(lèi)變量20
經(jīng)測(cè)試,我們可以發(fā)現(xiàn)內(nèi)部類(lèi)對(duì)象不能直接獲得,只能由外部類(lèi)的對(duì)象獲取。并且我們通過(guò)輸出結(jié)果,可以發(fā)現(xiàn)當(dāng)外部類(lèi)和內(nèi)部類(lèi)有相同屬性時(shí),在內(nèi)部類(lèi)中會(huì)優(yōu)先輸出內(nèi)部類(lèi)的屬性,只有通過(guò)外部類(lèi)的對(duì)象來(lái)調(diào)用age屬性,才會(huì)在本例中輸出20。在內(nèi)部類(lèi)中,使用this,可以獲取內(nèi)部類(lèi)的屬性。
局部?jī)?nèi)部類(lèi)
這時(shí)候,我們轉(zhuǎn)變一下思路,索性把Student類(lèi)的創(chuàng)建放在People類(lèi)的方法里,再看看結(jié)果會(huì)怎么樣。
public class People { private String name; private int age=20; private int ID ; public static void main(String[] args){ People p = new People(); class Student { private String name; private int age=18; private int studentNumber; public void study(){ System.out.println("輸出age"+age); System.out.println("內(nèi)部類(lèi)變量"+this.age); System.out.println("外部類(lèi)變量"+p.age); } } new Student().study(); } }
輸出結(jié)構(gòu)和之前是一樣的,這也不奇怪,我們只是把類(lèi)在方法里定義了,我們可以聯(lián)想到局部變量的定義,只能在本方法中使用,那么,方法內(nèi)的類(lèi)自然也只是屬于這個(gè)方法,訪問(wèn)權(quán)限只限于方法內(nèi)。
靜態(tài)嵌套類(lèi)
既然開(kāi)始了我們就不停下探索的腳步,我們把內(nèi)部類(lèi)變成靜態(tài)類(lèi),我們可以理解為,這個(gè)內(nèi)部類(lèi)現(xiàn)在屬于外部類(lèi)了,外部類(lèi)可以通過(guò)類(lèi)名來(lái)調(diào)用這個(gè)類(lèi)并創(chuàng)建對(duì)象,毫無(wú)疑問(wèn),結(jié)果是輸出18。
public class People { private String name; private int age=20; private int ID ; public static void main(String[] args){ People p = new People(); new People.Student().study(); } static class Student { private String name; private int age=18; private int studentNumber; public void study(){ System.out.println("輸出age"+age); System.out.println("內(nèi)部類(lèi)變量"+this.age); } } }
匿名內(nèi)部類(lèi)
匿名內(nèi)部類(lèi)的實(shí)現(xiàn)涉及到了抽象類(lèi)的實(shí)現(xiàn),那么什么是抽象類(lèi)呢?抽象類(lèi)擁有一系列抽象的屬性或者方法,它本身不能new對(duì)象,只有在它被繼承并被重寫(xiě)所有抽象方法之后才能得到實(shí)現(xiàn)。我們這次要通過(guò)創(chuàng)建一個(gè)匿名內(nèi)部類(lèi)的對(duì)象來(lái)使得一個(gè)抽象的類(lèi)得到實(shí)體化并執(zhí)行一系列方法。首先我們需要?jiǎng)?chuàng)建一個(gè)抽象類(lèi),然后再寫(xiě)一個(gè)類(lèi)創(chuàng)建匿名內(nèi)部類(lèi)的對(duì)象實(shí)現(xiàn)抽象類(lèi)的方法(此處我們沒(méi)有用到繼承)。
abstract class People { private String name; private int age=20; private int ID ; public abstract void work(); } public class Test{ public static void main(String[] args){ Test t = new Test(); t.test(new People(){ public void work(){ System.out.println("我在工作"); } }); } public void test(People people){ people.work(); } }
這段代碼的關(guān)鍵部分在:
t.test(new People(){ public void work(){ System.out.println("我在工作"); } });
似乎我們new了一個(gè)抽象類(lèi)People的對(duì)象,但其實(shí)我們通過(guò)了匿名內(nèi)部類(lèi)來(lái)實(shí)現(xiàn)People類(lèi)的實(shí)例化,它實(shí)現(xiàn)了work()抽象方法,然后調(diào)用此方法,輸出“我在工作”。
以上所述是小編給大家介紹的java外部類(lèi)與內(nèi)部類(lèi)的關(guān)系詳解,希望對(duì)大家有所幫助。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
SpringBoot配置shiro安全框架的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot配置shiro安全框架的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04idea中Maven鏡像源詳細(xì)配置步驟記錄(對(duì)所有項(xiàng)目)
Maven是一個(gè)能使我們的java程序開(kāi)發(fā)節(jié)省時(shí)間和精力,是開(kāi)發(fā)變得相對(duì)簡(jiǎn)單,還能使開(kāi)發(fā)規(guī)范化的工具,下面這篇文章主要給大家介紹了關(guān)于idea中Maven鏡像源詳細(xì)配置(對(duì)所有項(xiàng)目)的相關(guān)資料,需要的朋友可以參考下2023-05-05SpringBoot+Hutool+thymeleaf完成導(dǎo)出Excel的實(shí)現(xiàn)方法
這篇文章主要介紹了SpringBoot+Hutool+thymeleaf完成導(dǎo)出Excel,本篇示例當(dāng)中不僅僅有后端,而且還提供了前端html,html當(dāng)中利用js將后端 輸出流直接下載為文件,需要的朋友可以參考下2022-03-03springMVC+jersey實(shí)現(xiàn)跨服務(wù)器文件上傳
這篇文章主要介紹了springMVC+jersey實(shí)現(xiàn)跨服務(wù)器文件上傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08Spring配置多數(shù)據(jù)源導(dǎo)致事物無(wú)法回滾問(wèn)題
這篇文章主要介紹了Spring配置多數(shù)據(jù)源導(dǎo)致事物無(wú)法回滾問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01