整理java讀書筆記十五之java中的內(nèi)部類
內(nèi)部類是指在一個(gè)外部類的內(nèi)部再定義一個(gè)類。類名不需要和文件夾相同。
*內(nèi)部類可以是靜態(tài)static的,也可用public,default,protected和private修飾。(而外部頂級(jí)類即類名和文件名相同的只能使用public和default)。
前言
Java從JDK1.1的時(shí)候,就開始引入內(nèi)部類的概念了,那么小編也通過這篇博客來分享一下Java中有關(guān)內(nèi)部類的一些特性。
什么是內(nèi)部類?
在很多情況下,類被定義成一個(gè)獨(dú)立的程序單元,但是有時(shí)候也會(huì)把一個(gè)類放在另一個(gè)類的內(nèi)部定義,這個(gè)定義在其他類內(nèi)部的類就稱為內(nèi)部類。
從語法上來看的話,定義內(nèi)部類和定義外部類的語法大致相同,內(nèi)部類除了需要定義在其他類里面之外,還存在如下兩點(diǎn)區(qū)別。
1.內(nèi)部類比外部類多使用三個(gè)修飾符:private——protected、static——外部類不可以使用這三個(gè)修飾符。
2.非靜態(tài)內(nèi)部類不能擁有靜態(tài)成員。
除了以上兩點(diǎn)之外,其他的地方都與普通的類相同,下面來列舉一下常見的內(nèi)部類操作。
非靜態(tài)內(nèi)部類
定義內(nèi)部類也非常簡(jiǎn)單,只要把一個(gè)類放在另一個(gè)類內(nèi)部定義即可,甚至都可以放置在方法的內(nèi)部。
<span style="font-family:Comic Sans MS;font-size:18px;">package com.test; public class Cow { private double weight; // 外部類的兩個(gè)重載的構(gòu)造器 public Cow(){} public Cow(double weight) { this.weight = weight; } // 定義一個(gè)非靜態(tài)內(nèi)部類 private class CowLeg { // 非靜態(tài)內(nèi)部類的兩個(gè)實(shí)例變量 private double length; private String color; // 非靜態(tài)內(nèi)部類的兩個(gè)重載的構(gòu)造器 public CowLeg(){} public CowLeg(double length , String color) { this.length = length; this.color = color; } // 下面省略length、color的setter和getter方法 public void setLength(double length) { this.length = length; } public double getLength() { return this.length; } public void setColor(String color) { this.color = color; } public String getColor() { return this.color; } // 非靜態(tài)內(nèi)部類的實(shí)例方法 public void info() { System.out.println("當(dāng)前牛腿顏色是:" + color + ", 高:" + length); // 直接訪問外部類的private修飾的成員變量 System.out.println("本牛腿所在奶牛重:" + weight); //① } } public void test() { CowLeg cl = new CowLeg(1.12 , "黑白相間"); cl.info(); } public static void main(String[] args) { Cow cow = new Cow(378.9); cow.test(); } } </span>
在上述中非靜態(tài)內(nèi)部類的成員可以訪問外部類的private成員,但反過來就不成立了。非靜態(tài)內(nèi)部類的成員只在非靜態(tài)內(nèi)部類范圍內(nèi)是可知的,并不能被外部類直接使用。如果外部類需要訪問非靜態(tài)內(nèi)部類的成員,則必須顯式創(chuàng)建非靜態(tài)內(nèi)部類對(duì)象來調(diào)用訪問其實(shí)例成員。
<span style="font-family:Comic Sans MS;font-size:18px;">package com.test; public class Outer { private int outProp = 9; class Inner { private int inProp = 5; public void acessOuterProp() { // 非靜態(tài)內(nèi)部類可以直接訪問外部類的private成員變量 System.out.println("外部類的outProp值:" + outProp); } } public void accessInnerProp() { // 外部類不能直接訪問非靜態(tài)內(nèi)部類的實(shí)例變量, // 下面代碼出現(xiàn)編譯錯(cuò)誤 // System.out.println("內(nèi)部類的inProp值:" + inProp); // 如需訪問內(nèi)部類的實(shí)例變量,必須顯式創(chuàng)建內(nèi)部類對(duì)象 System.out.println("內(nèi)部類的inProp值:" + new Inner().inProp); } public static void main(String[] args) { // 執(zhí)行下面代碼,只創(chuàng)建了外部類對(duì)象,還未創(chuàng)建內(nèi)部類對(duì)象 Outer out = new Outer(); //① out.accessInnerProp(); } } </span>
注意:非靜態(tài)內(nèi)部類中不能有靜態(tài)方法、靜態(tài)成員變量、靜態(tài)初始化塊。
靜態(tài)內(nèi)部類
如果使用static來修飾一個(gè)內(nèi)部類,則這個(gè)內(nèi)部類就屬于外部類本身,而不屬于外部類的某個(gè)對(duì)象,因此使用static修飾的內(nèi)部類被稱為類內(nèi)部類,有的地方也稱為靜態(tài)內(nèi)部類。靜態(tài)內(nèi)部類可以包含靜態(tài)成員,也可以包含非靜態(tài)成員。根據(jù)靜態(tài)成員不能訪問非靜態(tài)成員的規(guī)則,靜態(tài)內(nèi)部類不能訪問外部類的實(shí)例成員,只能訪問外部類的類成員。
<span style="font-family:Comic Sans MS;font-size:18px;">package com.test; public class StaticInnerClassTest { private int prop1 = 5; private static int prop2 = 9; static class StaticInnerClass { // 靜態(tài)內(nèi)部類里可以包含靜態(tài)成員 private static int age; public void accessOuterProp() { // 下面代碼出現(xiàn)錯(cuò)誤: // 靜態(tài)內(nèi)部類無法訪問外部類的實(shí)例變量 System.out.println(prop1); // 下面代碼正常 System.out.println(prop2); } } } </span>
匿名內(nèi)部類
使用匿名內(nèi)部類可以創(chuàng)建那種只需要一次使用的類,并且創(chuàng)建匿名內(nèi)部類時(shí)會(huì)立即創(chuàng)建一個(gè)該類的實(shí)例,但是也需要注意一下規(guī)則
1.匿名內(nèi)部類不能是抽象類,因?yàn)橄到y(tǒng)在創(chuàng)建匿名內(nèi)部類時(shí),會(huì)立即創(chuàng)建匿名內(nèi)部類的對(duì)象,因此不允許將匿名內(nèi)部類定義成為抽象類
2.匿名內(nèi)部類不能定義構(gòu)造器,由于匿名內(nèi)部類沒有類名,所以無法定義構(gòu)造器
<span style="font-family:Comic Sans MS;font-size:18px;">package com.test; interface Product { public double getPrice(); public String getName(); } public class AnonymousTest { public void test(Product p) { System.out.println("購買了一個(gè)" + p.getName() + ",花掉了" + p.getPrice()); } public static void main(String[] args) { AnonymousTest ta = new AnonymousTest(); // 調(diào)用test()方法時(shí),需要傳入一個(gè)Product參數(shù), // 此處傳入其匿名實(shí)現(xiàn)類的實(shí)例 ta.test(new Product() { public double getPrice() { return 567.8; } public String getName() { return "AGP顯卡"; } }); } } </span>
下面給大家總結(jié)以下內(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)成員變量 。
相關(guān)文章
Java使用Arrays.asList報(bào)UnsupportedOperationException的解決
這篇文章主要介紹了Java使用Arrays.asList報(bào)UnsupportedOperationException的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Spring實(shí)現(xiàn)聲明式事務(wù)的方法詳解
這篇文章主要介紹了Spring實(shí)現(xiàn)聲明式事務(wù)的方法詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01java 反射調(diào)用Service導(dǎo)致Spring注入Dao失效的解決方案
這篇文章主要介紹了java 反射調(diào)用Service導(dǎo)致Spring注入Dao失效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08MybatisPlus3.3.0沒有MybatisPlusInterceptor類問題的解決方法
項(xiàng)目使用的是mybatis-plus-extension3.3.0依賴,然后在我使用分頁插件的時(shí)候,發(fā)現(xiàn)無法導(dǎo)入MybatisPlusInterceptor類所以本文給大家介紹了MybatisPlus3.3.0沒有MybatisPlusInterceptor類問題的解決方法,需要的朋友可以參考下2023-12-12Java聊天室之實(shí)現(xiàn)聊天室服務(wù)端功能
這篇文章主要為大家詳細(xì)介紹了Java簡(jiǎn)易聊天室之實(shí)現(xiàn)聊天室服務(wù)端功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以了解一下2022-10-10關(guān)于Springboot | @RequestBody 接收到的參數(shù)對(duì)象屬性為空的問題
這篇文章主要介紹了關(guān)于Springboot | @RequestBody 接收到的參數(shù)對(duì)象屬性為空的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03