内部類主要分為四類:
(1)成員内部類
(2)靜态内部類
(3)方法内部類
(4)匿名内部類
在本文中主要介紹成員内部類:
1、成員内部類
1.1 成員内部類的定義
成員内部類是最常見的一種内部類,定義一個成員内部類就和定義成員變量類似,直接在一個類的内部再定義一個類,和成員變量可以說是同級關系。
public class OutClass {
private String name = " ";//成員屬性
public class InnerClass{//成員内部類
private String name = "";//成員内部類中的屬性可以和外部類的屬性同名
private static Integer age = 18;//此處報編譯錯誤,成員内部類中的屬性不可以用static修飾
public static void print() {//内部類中的方法也不能用static修飾
}
}
}
需要注意的是:
(1) 成員内部類中的屬性可以和外部類的屬性同名
(2)成員内部類中的屬性不可以用static修飾
(3)内部類中的方法也不能用static修飾
正如成員方法中要定義屬性的話,隻能用final進行修飾,無法利用 private 和 static 修飾一樣
在這裡InnerClass 需要以來外部類OutClass的存在而存在,及想要建立一個内部類,需要先建立一個外部類。
另外:
(1)内部類對象可以通路外部類對象中所有通路權限的字段;
(2)外部類對象也可以通過内部類的對象引用來通路内部類中定義的所有通路權限的字段。
1.2 成員内部類的調用
1.2.1 在外部類中建立内部類對象
class OutClass {
String name = "張三";
InnerClass innerClass = new InnerClass();//1.在外部類中建立内部類對象
public class InnerClass{//成員内部類
private String name = "李四";
private Integer age = 18;
public void print() {
System.out.println("name:"+name+" age:"+age);
}
}
}
public class test{
public static void main(String[] args) {
OutClass outClass = new OutClass();//2.建立外部類對象
outClass.innerClass.print();//3.通過outClass調用内部類中的方法
}
}
**輸出結果:**name:李四 age:18
1.2.2 利用構造方法調用成員内部類
class OutClass {
String name = "張三";
public OutClass() {
InnerClass innerClass = new InnerClass();//在構造方法中建立内部類對象
innerClass.print();//調用内部類中的方法
}
public class InnerClass{//成員内部類
private String name = "李四";
private Integer age = 20;
public void print() {
System.out.println("name:"+name+" age:"+age);
}
}
}
public class test{
public static void main(String[] args) {
OutClass outClass = new OutClass();//利用外部類的無參構造方法調用其内部類對象
}
}
**輸出結果:**name:李四 age:20
1.3 内部類如何調用外部類中的屬性
1.3.1 利用static修飾
将外部類的成員屬性用static修飾,然後直接類名.屬性(這種情況屬于外部類的屬性與内部類的屬性重名時)
class OutClass {
static String name = "張三";//用static修飾
InnerClass innerClass = new InnerClass();
public class InnerClass{//成員内部類
private String name = "李四";
private Integer age = 20;
public void print() {
System.out.println("name:"+name+" age:"+age+" 外部類屬性:"+OutClass.name);//直接類名.屬性
}
}
}
public class test{
public static void main(String[] args) {
OutClass outClass = new OutClass();//利用外部類的無參構造方法調用其内部類對象
outClass.innerClass.print();
}
}
**輸出結果:**name:李四 age:20 外部類屬性:張三
1.3.2 直接調用屬性
當外部類的屬性與内部類的屬性沒有同名時,可以直接在内部類中使用外部類中的屬性
class OutClass {
String name = "張三";
InnerClass innerClass = new InnerClass();
public OutClass() {}
public class InnerClass{//成員内部類
//private String name = "李四";//注釋掉同名的屬性
private Integer age = 20;
public void print() {
System.out.println("name:"+name+" age:"+age);//直接使用外部類中的屬性即可
}
}
}
public class test{
public static void main(String[] args) {
OutClass outClass = new OutClass();//利用外部類的無參構造方法調用其内部類對象
outClass.innerClass.print();
}
}
**輸出結果:**name:張三 age:20