新手初學Java的內(nèi)部類
Java的內(nèi)部類
概念:
- 內(nèi)部類就是在一個類的內(nèi)部定義一個類,比如,A類中定義一個B類,那么B類相對于A類來說就是稱為內(nèi)部類,而A類相對于B類來說就是外部類。
- 成員內(nèi)部類
- 靜態(tài)內(nèi)部類
- 局部內(nèi)部類
- 匿名內(nèi)部類
特點:
- 內(nèi)部類編譯之后可以生成獨立的字節(jié)碼文件。
- 內(nèi)部類可以直接訪問外部類的私有成員,而不破壞封裝。
- 內(nèi)部類可為外部類提供必要的內(nèi)部功能組件。
- 外部類要訪問內(nèi)部類的成員,必須要建立內(nèi)部類的對象
成員內(nèi)部類
在內(nèi)的內(nèi)部定義,與實例變量、實例方法同級別的類。
成員內(nèi)部類中不能包含靜態(tài)成員,但可以包含靜態(tài)常量。
package com.cnblogs;
//這個類用于實現(xiàn)
public class Application {
public static void main(String[] args) {
Outer outer = new Outer();//實例化 外部類
Outer.Inner inner = outer.new Inner();//實例化 內(nèi)部類
//一步到位實例化內(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();
}
}
}
注意:當外部類、內(nèi)部類存在重名屬性時,會優(yōu)先訪問內(nèi)部類屬性
package com.cnblogs;
import com.cnblogs.Outer.Inner;
/*
* 本類用于實現(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)部類
不依賴外部類對象,可直接創(chuàng)建或通過類名訪問,可聲明靜態(tài)成員
package com.cnblogs;
import com.cnblogs.Outer2.Inner;
/*
* 本類用于實現(xiàn)
*/
public class Application {
public static void main(String[] args) {
//直接創(chuàng)建內(nèi)部類對象
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)建外部類對象
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)建對象范圍僅限于當前方法。
局部內(nèi)部類訪問外部類當前方法中的局部變量時,因無法保障變量的生命周期與自身相同,變量必須修飾為final。
限制類的使用范圍。
package com.cnblogs;
//這個類用于實現(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自動添加final
System.out.println(in);
}
}
//創(chuàng)建內(nèi)部類對象
Inner inner = new Inner();
inner.show2();
}
}
匿名內(nèi)部類
沒有類名的局部內(nèi)部類(一切特征都與內(nèi)部類相同)。
必須繼承一個父類或者實現(xiàn)一個接口。
定義類、實現(xiàn)類、創(chuàng)建對象的語法合并,只能創(chuàng)建一個該類的對象。
- 優(yōu)點:減少代碼量
- 缺點:可讀性較差
package com.cnblogs;
/*
* 本類用于實現(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)建對象
// Usb usb = new Fan();
// usb.service();
//使用匿名內(nèi)部類優(yōu)化(相當于創(chuàng)建了一個局部內(nèi)部類)
Usb usb = new Usb() {
@Override
public void service() {
System.out.println("鏈接成功,可以使用!?。?!");
}
};
usb.service();
}
}
package com.cnblogs;
//接口
public interface Usb {
//服務
void service();
}
package com.cnblogs;
//實現(xiàn)接口
public class Mouse implements Usb{
@Override
public void service() {
System.out.println("鏈接成功,可以使用?。。。?!");
}
}
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望你能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Spring?Boot?整合持久層之Spring Data JPA
在介紹Spring Data JPA的時候,我們首先認識下Hibernate。Hibernate是數(shù)據(jù)訪問解決技術(shù)的絕對霸主,使用O/R映射技術(shù)實現(xiàn)數(shù)據(jù)訪問,O/R映射即將領(lǐng)域模型類和數(shù)據(jù)庫的表進行映射,通過程序操作對象而實現(xiàn)表數(shù)據(jù)操作的能力,讓數(shù)據(jù)訪問操作無須關(guān)注數(shù)據(jù)庫相關(guān)的技術(shù)2022-08-08
java算法導論之FloydWarshall算法實現(xiàn)代碼
這篇文章主要介紹了算法導論之FloydWarshall算法實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05
SpringBoot集成Redis并實現(xiàn)主從架構(gòu)的實踐
本文主要和大家分享一下在springboot中如何集成redis,并實現(xiàn)主從架構(gòu),進行數(shù)據(jù)的簡單存儲,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12
tomcat connection-timeout連接超時源碼解析
這篇文章主要為大家介紹了tomcat connection-timeout連接超時源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11

