新手初學(xué)Java的內(nèi)部類
Java的內(nèi)部類
概念:
- 內(nèi)部類就是在一個(gè)類的內(nèi)部定義一個(gè)類,比如,A類中定義一個(gè)B類,那么B類相對(duì)于A類來(lái)說(shuō)就是稱為內(nèi)部類,而A類相對(duì)于B類來(lái)說(shuō)就是外部類。
- 成員內(nèi)部類
- 靜態(tài)內(nèi)部類
- 局部?jī)?nèi)部類
- 匿名內(nèi)部類
特點(diǎn):
- 內(nèi)部類編譯之后可以生成獨(dú)立的字節(jié)碼文件。
- 內(nèi)部類可以直接訪問(wèn)外部類的私有成員,而不破壞封裝。
- 內(nèi)部類可為外部類提供必要的內(nèi)部功能組件。
- 外部類要訪問(wèn)內(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;
/*
* 本類用于測(cè)試內(nèi)部類可以直接訪問(wèn)外部類的私有成員
*/
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)先訪問(wèn)內(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;
/*
* 本類用于測(cè)試內(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)建或通過(guò)類名訪問(wèn),可聲明靜態(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;
/*
* 本類用于測(cè)速靜態(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
}
}
}
局部?jī)?nèi)部類
定義在外部類方法中,作用范圍和創(chuàng)建對(duì)象范圍僅限于當(dāng)前方法。
局部?jī)?nèi)部類訪問(wèn)外部類當(dāng)前方法中的局部變量時(shí),因無(wú)法保障變量的生命周期與自身相同,變量必須修飾為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;
/*
* 本類用于測(cè)試局部?jī)?nèi)部類
*/
//外部類
public class Outer3 {
private String name = "柒";
private int age = 21;
public void show() {
//定義局部變量
String in = "蘇州";
//局部?jī)?nèi)部類:不能加任何訪問(wèn)修飾符
class Inner{
//局部?jī)?nèi)部類的屬性
private String phone = "10086";
//局部?jī)?nèi)部類方法
public void show2() {
//訪問(wèn)外部類屬性
System.out.println(name);//Outer3.this.name
System.out.println(age);
//訪問(wèn)內(nèi)部類屬性
System.out.println(phone);//this.phone
//訪問(wèn)局部變量: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)部類
沒(méi)有類名的局部?jī)?nèi)部類(一切特征都與內(nèi)部類相同)。
必須繼承一個(gè)父類或者實(shí)現(xiàn)一個(gè)接口。
定義類、實(shí)現(xiàn)類、創(chuàng)建對(duì)象的語(yǔ)法合并,只能創(chuàng)建一個(gè)該類的對(duì)象。
- 優(yōu)點(diǎn):減少代碼量
- 缺點(diǎn):可讀性較差
package com.cnblogs;
/*
* 本類用于實(shí)現(xiàn)局部?jī)?nèi)部類
*/
public class TestUsb {
public static void main(String[] args) {
//創(chuàng)建接口類型的變量
// Usb usb = new Mouse();
// usb.service();
//局部?jī)?nèi)部類
// class Fan implements Usb{
//
// @Override
// public void service() {
// System.out.println("鏈接成功,可以使用?。。?!");
//
// }
//
// }
//使用局部?jī)?nèi)部類創(chuàng)建對(duì)象
// Usb usb = new Fan();
// usb.service();
//使用匿名內(nèi)部類優(yōu)化(相當(dāng)于創(chuàng)建了一個(gè)局部?jī)?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é)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望你能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java操作redis設(shè)置第二天凌晨過(guò)期的解決方案
這篇文章主要介紹了Java操作redis設(shè)置第二天凌晨過(guò)期的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
Spring?Boot?整合持久層之Spring Data JPA
在介紹Spring Data JPA的時(shí)候,我們首先認(rèn)識(shí)下Hibernate。Hibernate是數(shù)據(jù)訪問(wèn)解決技術(shù)的絕對(duì)霸主,使用O/R映射技術(shù)實(shí)現(xiàn)數(shù)據(jù)訪問(wèn),O/R映射即將領(lǐng)域模型類和數(shù)據(jù)庫(kù)的表進(jìn)行映射,通過(guò)程序操作對(duì)象而實(shí)現(xiàn)表數(shù)據(jù)操作的能力,讓數(shù)據(jù)訪問(wèn)操作無(wú)須關(guān)注數(shù)據(jù)庫(kù)相關(guān)的技術(shù)2022-08-08
java算法導(dǎo)論之FloydWarshall算法實(shí)現(xiàn)代碼
這篇文章主要介紹了算法導(dǎo)論之FloydWarshall算法實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05
SpringBoot集成Redis并實(shí)現(xiàn)主從架構(gòu)的實(shí)踐
本文主要和大家分享一下在springboot中如何集成redis,并實(shí)現(xiàn)主從架構(gòu),進(jìn)行數(shù)據(jù)的簡(jiǎn)單存儲(chǔ),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
tomcat connection-timeout連接超時(shí)源碼解析
這篇文章主要為大家介紹了tomcat connection-timeout連接超時(shí)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
詳解spring cloud ouath2中的資源服務(wù)器
這篇文章主要介紹了spring cloud ouath2中的資源服務(wù)器的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02

