新手初學(xué)Java的內(nèi)部類
Java的內(nèi)部類
概念:
- 內(nèi)部類就是在一個(gè)類的內(nèi)部定義一個(gè)類,比如,A類中定義一個(gè)B類,那么B類相對(duì)于A類來說就是稱為內(nèi)部類,而A類相對(duì)于B類來說就是外部類。
- 成員內(nèi)部類
- 靜態(tài)內(nèi)部類
- 局部內(nèi)部類
- 匿名內(nèi)部類
特點(diǎn):
- 內(nèi)部類編譯之后可以生成獨(dú)立的字節(jié)碼文件。
- 內(nèi)部類可以直接訪問外部類的私有成員,而不破壞封裝。
- 內(nèi)部類可為外部類提供必要的內(nèi)部功能組件。
- 外部類要訪問內(nèi)部類的成員,必須要建立內(nèi)部類的對(duì)象
成員內(nèi)部類
在內(nèi)的內(nèi)部定義,與實(shí)例變量、實(shí)例方法同級(jí)別的類。
成員內(nèi)部類中不能包含靜態(tài)成員,但可以包含靜態(tài)常量。
package com.cnblogs;
//這個(gè)類用于實(shí)現(xiàn)
public class Application {
public static void main(String[] args) {
Outer outer = new Outer();//實(shí)例化 外部類
Outer.Inner inner = outer.new Inner();//實(shí)例化 內(nèi)部類
//一步到位實(shí)例化內(nèi)部類
//Inner inner = new Outer().new Inner();
//外部類的屬性
System.out.println(outer.age);//21
//外部類方法
outer.out1();//這是外部類的方法
//內(nèi)部類屬性
System.out.println(inner.in);//內(nèi)部類屬性
//內(nèi)部類方法
inner.inner();//這是內(nèi)部類方法
//內(nèi)部類獲取外部類的私有屬性
inner.getName();//獲取到了外部類的私有屬性:柒
//內(nèi)部類獲取外部類的私有方法
inner.getMethod();//這是外部類的私有方法
}
}
package com.cnblogs;
/*
* 本類用于測試內(nèi)部類可以直接訪問外部類的私有成員
*/
public class Outer {
//外部類的私有屬性
private String name = "柒";
//外部類的屬性
public int age = 21;
//外部類的私有方法
private void out() {
System.out.println("這是外部類的私有方法");
}
//外部類的方法
public void out1() {
System.out.println("這是外部類的方法");
}
class Inner{
//內(nèi)部類屬性
public String in = "內(nèi)部類屬性";
//內(nèi)部類方法
public void inner() {
System.out.println("這是內(nèi)部類方法");
}
//獲取外部類的私有屬性
public void getName() {
System.out.println("獲取到了外部類的私有屬性:" + name);
}
//獲取外部類的私有方法
public void getMethod() {
out();
}
}
}
注意:當(dāng)外部類、內(nèi)部類存在重名屬性時(shí),會(huì)優(yōu)先訪問內(nèi)部類屬性
package com.cnblogs;
import com.cnblogs.Outer.Inner;
/*
* 本類用于實(shí)現(xiàn)
*/
public class Application {
public static void main(String[] args) {
Inner inner = new Outer().new Inner();
inner.show();
}
}
package com.cnblogs;
/*
* 本類用于測試內(nèi)部類和外部類的同名屬性
*/
public class Outer {
//外部類屬性
private String name = "張三";
class Inner{
//內(nèi)部類屬性
private String name = "柒";
//內(nèi)部類方法,用于打印
public void show() {
//這里打印出的是內(nèi)部類的屬性:柒
System.out.println(name);
//這是打印外部類的屬性:張三
System.out.println(Outer.this.name);
}
}
}
靜態(tài)內(nèi)部類
不依賴外部類對(duì)象,可直接創(chuàng)建或通過類名訪問,可聲明靜態(tài)成員
package com.cnblogs;
import com.cnblogs.Outer2.Inner;
/*
* 本類用于實(shí)現(xiàn)
*/
public class Application {
public static void main(String[] args) {
//直接創(chuàng)建內(nèi)部類對(duì)象
Inner inner = new Outer2.Inner();
//調(diào)用方法
inner.show();
}
}
package com.cnblogs;
/*
* 本類用于測速靜態(tài)內(nèi)部類
*/
//外部類
public class Outer2 {
private String name = "柒";
private int age = 21;
//靜態(tài)內(nèi)部類 用法和外部類一樣
static class Inner{
private String in = "靜態(tài)內(nèi)部類屬性";
private int inner = 99;
//靜態(tài)成員
private static int inners = 999;
//調(diào)用方法
public void show() {
//調(diào)用外部類屬性,先創(chuàng)建外部類對(duì)象
Outer2 outer = new Outer2();
//再調(diào)用外部類屬性
System.out.println(outer.name);//柒
System.out.println(outer.age);//21
//調(diào)用靜態(tài)內(nèi)部類屬性
System.out.println(in);//靜態(tài)內(nèi)部類屬性
System.out.println(inner);//99
//調(diào)用靜態(tài)內(nèi)部類的靜態(tài)成員
System.out.println(inners);//999
System.out.println(Inner.inners);//999
}
}
}
局部內(nèi)部類
定義在外部類方法中,作用范圍和創(chuàng)建對(duì)象范圍僅限于當(dāng)前方法。
局部內(nèi)部類訪問外部類當(dāng)前方法中的局部變量時(shí),因無法保障變量的生命周期與自身相同,變量必須修飾為final。
限制類的使用范圍。
package com.cnblogs;
//這個(gè)類用于實(shí)現(xiàn)
public class Application {
public static void main(String[] args) {
Outer3 outer = new Outer3();
outer.show();
}
}
package com.cnblogs;
/*
* 本類用于測試局部內(nèi)部類
*/
//外部類
public class Outer3 {
private String name = "柒";
private int age = 21;
public void show() {
//定義局部變量
String in = "蘇州";
//局部內(nèi)部類:不能加任何訪問修飾符
class Inner{
//局部內(nèi)部類的屬性
private String phone = "10086";
//局部內(nèi)部類方法
public void show2() {
//訪問外部類屬性
System.out.println(name);//Outer3.this.name
System.out.println(age);
//訪問內(nèi)部類屬性
System.out.println(phone);//this.phone
//訪問局部變量:jdk1.7要求 變量必須是常量final,jdk1.8自動(dòng)添加final
System.out.println(in);
}
}
//創(chuàng)建內(nèi)部類對(duì)象
Inner inner = new Inner();
inner.show2();
}
}
匿名內(nèi)部類
沒有類名的局部內(nèi)部類(一切特征都與內(nèi)部類相同)。
必須繼承一個(gè)父類或者實(shí)現(xiàn)一個(gè)接口。
定義類、實(shí)現(xiàn)類、創(chuàng)建對(duì)象的語法合并,只能創(chuàng)建一個(gè)該類的對(duì)象。
- 優(yōu)點(diǎn):減少代碼量
- 缺點(diǎn):可讀性較差
package com.cnblogs;
/*
* 本類用于實(shí)現(xiàn)局部內(nèi)部類
*/
public class TestUsb {
public static void main(String[] args) {
//創(chuàng)建接口類型的變量
// Usb usb = new Mouse();
// usb.service();
//局部內(nèi)部類
// class Fan implements Usb{
//
// @Override
// public void service() {
// System.out.println("鏈接成功,可以使用?。。?!");
//
// }
//
// }
//使用局部內(nèi)部類創(chuàng)建對(duì)象
// Usb usb = new Fan();
// usb.service();
//使用匿名內(nèi)部類優(yōu)化(相當(dāng)于創(chuàng)建了一個(gè)局部內(nèi)部類)
Usb usb = new Usb() {
@Override
public void service() {
System.out.println("鏈接成功,可以使用?。。?!");
}
};
usb.service();
}
}
package com.cnblogs;
//接口
public interface Usb {
//服務(wù)
void service();
}
package com.cnblogs;
//實(shí)現(xiàn)接口
public class Mouse implements Usb{
@Override
public void service() {
System.out.println("鏈接成功,可以使用?。。。?!");
}
}
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望你能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
SpringBoot實(shí)現(xiàn)人臉識(shí)別等多種登錄方式
本文主要介紹了SpringBoot實(shí)現(xiàn)人臉識(shí)別等多種登錄方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
log4j2動(dòng)態(tài)修改日志級(jí)別及拓展性使用詳解
這篇文章主要介紹了log4j2動(dòng)態(tài)修改日志級(jí)別及拓展性使用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11
SpringBoot結(jié)合JSR303對(duì)前端數(shù)據(jù)進(jìn)行校驗(yàn)的示例代碼
這篇文章主要介紹了SpringBoot結(jié)合JSR303對(duì)前端數(shù)據(jù)進(jìn)行校驗(yàn)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Java中Scanner的常用方法總結(jié)(一次學(xué)懂)
這篇文章主要給大家介紹了關(guān)于Java中Scanner常用方法的相關(guān)資料,Java中的Scanner是一個(gè)用于讀取用戶輸入的類,它可以讀取各種類型的數(shù)據(jù),包括整數(shù)、浮點(diǎn)數(shù)、字符串等等,需要的朋友可以參考下2023-11-11
Mybatis-plus設(shè)置某個(gè)字段值為null的方法總結(jié)
mybatis-plus以下簡稱mp,目前應(yīng)該也算是主流的一款數(shù)據(jù)訪問層應(yīng)用框架,下面這篇文章主要給大家介紹了關(guān)于Mybatis-plus設(shè)置某個(gè)字段值為null的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
SpringBoot沒有讀取到application.yml問題及解決
這篇文章主要介紹了SpringBoot沒有讀取到application.yml問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
SpringBoot Mybatis動(dòng)態(tài)數(shù)據(jù)源切換方案實(shí)現(xiàn)過程
這篇文章主要介紹了SpringBoot+Mybatis實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換方案過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
java協(xié)程框架quasar和kotlin中的協(xié)程對(duì)比分析
這篇文章主要為大家介紹了java協(xié)程框架quasar和kotlin兩個(gè)協(xié)程對(duì)比分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多基本2022-02-02

