Java的內(nèi)部類(lèi)總結(jié)
前言
最近看了內(nèi)部類(lèi)后,總結(jié)一下,首先內(nèi)部類(lèi)嵌套在其他內(nèi)部的類(lèi),根據(jù)出現(xiàn)的位置和關(guān)鍵字,可以分為以下四種類(lèi):成員內(nèi)部類(lèi),靜態(tài)內(nèi)部類(lèi),方法內(nèi)部類(lèi),匿名內(nèi)部類(lèi),接下來(lái)就介紹下這四種類(lèi),記得耐心看哦
一,成員內(nèi)部類(lèi)
1,成員內(nèi)部類(lèi)的特點(diǎn)
(1)private不可以用在外部類(lèi)的聲明,但可在內(nèi)部類(lèi)聲明,成員變量可以是private
(2)內(nèi)部類(lèi),外部類(lèi)可以相互訪問(wèn)彼此的私有域
A:內(nèi)部類(lèi)訪問(wèn)外部類(lèi)的私有域可以直接訪問(wèn),因?yàn)槌蓡T內(nèi)部類(lèi)含有隱藏對(duì)象
B:外部類(lèi)訪問(wèn)內(nèi)部類(lèi)的私有域通過(guò)內(nèi)部類(lèi)對(duì)象訪問(wèn)
(3)內(nèi)部類(lèi)可解決Java中單繼承問(wèn)題
(4)內(nèi)部類(lèi)可以對(duì)外部隱藏
2,成員內(nèi)部類(lèi)的實(shí)現(xiàn)
public class Outter { // 成員變量 private int age = 12; private String name = "zh"; private static final int A = 20; //成員內(nèi)部類(lèi) class Inner{ private String a = "hello"; private int age = 20; public void test(){ System.out.println(a); // 可以訪問(wèn)外部類(lèi)的私有域age System.out.println(Outter.this.age); //訪問(wèn)自己的age System.out.println(this.age); System.out.println(A); } } // 外部類(lèi)成員方法 public void fun() { int a = 0; // 外部類(lèi)內(nèi)部創(chuàng)建內(nèi)部類(lèi)對(duì)象 Inner inner = new Inner(); System.out.println(inner.a); }}class Test { public static void main(String[] args) { //外部類(lèi)的外部創(chuàng)建內(nèi)部類(lèi)對(duì)象 Outter.Inner inner = new Outter().new Inner(); }}public class Outter { // 成員變量 private int age = 12; private String name = "zh"; private static final int A = 20; //成員內(nèi)部類(lèi) class Inner{ private String a = "hello"; private int age = 20; public void test(){ System.out.println(a); // 可以訪問(wèn)外部類(lèi)的私有域age System.out.println(Outter.this.age); //訪問(wèn)自己的age System.out.println(this.age); System.out.println(A); } } // 外部類(lèi)成員方法 public void fun() { int a = 0; // 外部類(lèi)內(nèi)部創(chuàng)建內(nèi)部類(lèi)對(duì)象 Inner inner = new Inner(); System.out.println(inner.a); } } class Test { public static void main(String[] args) { //外部類(lèi)的外部創(chuàng)建內(nèi)部類(lèi)對(duì)象 Outter.Inner inner = new Outter().new Inner(); } }
3,內(nèi)部類(lèi)和外部類(lèi)的關(guān)系
A:成員內(nèi)部類(lèi)的創(chuàng)建需要依賴(lài)于外部類(lèi)對(duì)象
B:內(nèi)部類(lèi)和外部類(lèi)之間相互獨(dú)立
C:兩者的私有屬性可以相互訪問(wèn)
D:語(yǔ)法
(1)外部類(lèi)的內(nèi)部創(chuàng)建內(nèi)部類(lèi)對(duì)象
Inner inner = new Inner();
(2)外部類(lèi)的外部創(chuàng)建內(nèi)部類(lèi)對(duì)象
Outter.Intter intter = new Outter().new Intter();
E:在內(nèi)部類(lèi)的內(nèi)使用隱藏的this
二,靜態(tài)內(nèi)部類(lèi)
1,靜態(tài)內(nèi)部類(lèi)的特點(diǎn)
(1)定義在外部類(lèi)的內(nèi)部使用static修飾,靜態(tài)內(nèi)部類(lèi)無(wú)需外部類(lèi)無(wú)需外部類(lèi)產(chǎn)生對(duì)象就可以使用
(2)靜態(tài)內(nèi)部類(lèi)的創(chuàng)建語(yǔ)法
StaticInnerClass.Inner inner = new StaticInnerClass.Inner();
2,比較成員內(nèi)部類(lèi)和靜態(tài)內(nèi)部類(lèi)
(1)成員內(nèi)部類(lèi)不能擁有靜態(tài)域,但可以訪問(wèn)外部的靜態(tài)域
(2)靜態(tài)內(nèi)部類(lèi)可以擁有成員域,但不能訪問(wèn)外部的成員域
3,靜態(tài)內(nèi)部類(lèi)的實(shí)現(xiàn)
public class StaticInnerClass { static int age; String name; //靜態(tài)內(nèi)部類(lèi)--類(lèi)比--靜態(tài)變量 static class Inner{ private int age; public void test(){ System.out.println(age); // System.out.println(name);不能訪問(wèn)外部成員域 } } public void fun() { Inner inner = new Inner(); } } class Test1 { public static void main(String[] args) { StaticInnerClass.Inner inner = new StaticInnerClass.Inner(); } }
三,方法內(nèi)部類(lèi)
1,方法內(nèi)部類(lèi)的特點(diǎn)
(1)方法內(nèi)部類(lèi)定義在方法內(nèi)部
(2)對(duì)外部完全隱藏,因此不能有任何訪問(wèn)修飾
(3)若要方法的形參只能用,不能改(形參的隱式final聲明)
2,方法內(nèi)部類(lèi)的實(shí)現(xiàn)
//方法內(nèi)部類(lèi) public class FunClass { private int age; public void fun(int age) { class Inner { void fun() { // System.out.println(age); } } age = 10; } }
四, 匿名內(nèi)部類(lèi)
1,匿名內(nèi)部類(lèi)的特點(diǎn)
(1)匿名內(nèi)部類(lèi)定義在方法內(nèi)部,類(lèi)沒(méi)有名字
(2)必須繼承一個(gè)抽象類(lèi)或者實(shí)現(xiàn)一個(gè)接口
(3)沒(méi)有構(gòu)造方法
2,匿名內(nèi)部類(lèi)的實(shí)現(xiàn)
//實(shí)現(xiàn)接口interface IMessage { void fun();}public class NonNameClass { public static void main(String[] args) { //匿名內(nèi)部類(lèi) Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("hello A"); } }); Thread thread1 = new Thread({ System.out.println("hello "); } ); thread.start(); thread1.start(); }}//實(shí)現(xiàn)接口 interface IMessage { void fun(); } public class NonNameClass { public static void main(String[] args) { //匿名內(nèi)部類(lèi) Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("hello A"); } }); Thread thread1 = new Thread({ System.out.println("hello "); } ); thread.start(); thread1.start(); } }
總結(jié)
朋友們,看到最后是不是對(duì)內(nèi)部類(lèi)有了新的認(rèn)識(shí)?
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
IntelliJ IDEA配置Tomcat(完整版圖文教程)
這篇文章主要介紹了IntelliJ IDEA配置Tomcat(完整版圖文教程),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05SpringBoot如何指定某些類(lèi)優(yōu)先啟動(dòng)
這篇文章主要介紹了SpringBoot如何指定某些類(lèi)優(yōu)先啟動(dòng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09Springboot整合多數(shù)據(jù)源代碼示例詳解
這篇文章主要介紹了Springboot整合多數(shù)據(jù)源代碼示例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08SpringBoot可視化監(jiān)控的具體應(yīng)用
最近越發(fā)覺(jué)得,任何一個(gè)系統(tǒng)上線,運(yùn)維監(jiān)控都太重要了,本文介紹了SpringBoot可視化監(jiān)控的具體應(yīng)用,分享給大家,有興趣的同學(xué)可以參考一下2021-06-06sms4j?2.0?全新來(lái)襲功能的調(diào)整及maven變化詳解
這篇文章主要介紹了sms4j?2.0?全新來(lái)襲功能的調(diào)整及maven變化詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04Java8新特性之再見(jiàn)Permgen_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java8新特性之再見(jiàn)Permgen的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-06-06