內部類
基本介紹
- 概念:在一個類的內部再定義一個完整類
- 特點:編譯之后可生成獨立的字節碼文件;內部類可以直接訪問外部類的私有屬性,不破壞封裝性
- 分類:成員內部類;靜態內部類;局部內部類;匿名內部類
package Inten;
//頭部
public class What {
//內部類
class Hello{
}
}
內部類分類
成員內部類
基本介紹
- 在類的內部定義,與實例變量和實例方法同級別的類
- 外部類的一個實例部分,創建內部類對象時,必須依賴外部類對象
- 當外部類和內部類存在重名屬性時,會優先訪問內部類的屬性
- 成員內部類不能定義靜態成員
運用實例
ChenYuan.java
package Inten;
//外部類
public class ChengYuan {
//實例變量
private String name="李同洲";
private int age=18;
//內部類
class InterC{
private String address="江西";
private int tele=109;
private String name="Li";
//private static String contry="中國";static報錯
//方法
public void show(){
//打印外部類的屬性(實例變量),當內部屬性和外部屬性的名字相同時,如果不使用ChengYuan.this則表示的內部屬性
System.out.println(ChengYuan.this.name);
System.out.println(ChengYuan.this.age);
//打印內部類的屬性
System.out.println(address);//可以使用this.name
//System.out.println(this.address);
System.out.println(tele);
}
}
}
TestCheng.java
public class TestCheng {
public static void main(String[] args) {
//1.創建外部類對象
ChengYuan chengyuan = new ChengYuan();
//2.創建內部類對象
ChengYuan.InterC interC=chengyuan.new InterC();
//一步到位
ChengYuan.InterC interC2=new ChengYuan().new InterC();
interC.show();
}
}
靜態內部類
基本介紹
- 不依賴外部類對象,可直接創建或者通過類名訪問,可聲明靜態成員
運用實例
JingTai.java
package Inten;
//外部類
public class JingTai {
private String name="李同洲";
private int age=18;
//靜態內部類
static class InterJ {
private String address = "江西";
private int tele = 109;
private static String contry="中國";
public void show(){
//調用外部類的屬性值
//1.先創建外部類對象
JingTai jingTai=new JingTai();
//2.調用外部類對象的屬性
System.out.println(jingTai.name);
System.out.println(jingTai.age);
//3.調用內部類對象的屬性
System.out.println(address);
System.out.println(tele);
//4.調用內部類的靜態屬性
System.out.println(InterJ.contry);
}
}
}
TestJing.java
public class TestJing {
public static void main(String[] args) {
JingTai.InterJ interJ=new JingTai.InterJ();
interJ.show();
}
}
局部內部類
基本介紹
- 定義在外部方法中,作用范圍和創建對象僅限于當前方法中
- 局部內部類訪問當前方法的局部變量時,因無法保障變量的聲明周期與自身相同,變量必須修飾為final
- 限制類的使用范圍
運用實例
JuBu.java
public class JuBu {
private String name="李同洲";
private int age=18;
public void show(){
//定義局部變量
String address="江西";
//局部內部類:不能加任何訪問修飾符
class JuBuJ{
//局部內部類屬性
private int phone=123456;
private String emil="li@tongzhou";
public void show2(){
//訪問外部類屬性
System.out.println(name);
System.out.println(age);
//訪問內部類屬性
System.out.println(phone);
System.out.println(emil);
//訪問局部變量;jak1.7要求(變量必須時常量final);jdk1.8則會自動添加final
System.out.println(address);
}
}
//創建局部內部類對象
JuBuJ juBuJ=new JuBuJ();
juBuJ.show2();
}
}
TestJu.java
public class TestJu {
public static void main(String[] args) {
JuBu juBu=new JuBu();
juBu.show();
}
}
匿名內部類
基本介紹
- 沒有類名的局部內部類(一切特征與局部內部類相同)
- 必須繼承一個父類或者實現一個接口
- 定義類、實現類、創建對象的語法合并,只能創建一個該類的對象
- 優點:減少代碼量
- 缺點:可讀性較差
運用實例
Usb.java
package Inten;
//接口
public interface Usb {
//服務
void service();
}
NiMing.java
package Inten;
public class NiMing implements Usb{
@Override
public void service() {
System.out.println("連接成功");
}
}
TestNi.java
package Inten;
public class TestNi {
public static void main(String[] args) {
/*//創建接口類型的變量
Usb usb=new NiMing();
usb.service();
//局部內部類
class fan implements Usb{
@Override
public void service() {
System.out.println("開始工作");
}
}
//使用局部內部類創建對象
Usb usb1=new fan();
usb1.service();*/
//使用匿名內部類優化(相當于創建了一個局部內部類)
Usb usb=new Usb() {
@Override
public void service() {
System.out.println("開始工作");
}
};
usb.service();
}
}
浙公網安備 33010602011771號