内部类主要分为四类:
(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