1、什么是成员内部类?
无 static 修饰,属于外部类的对象
JDK16之前,成员内部类中不能定义静态成员,JDK 16开始也可以定义静态成员了。
public class Outer{
//成员内部类
public class Inner{
}
}
2、成员内部类创建对象的格式
格式:外部类名.内部类名 对象名 = new 外部类构造器.new 内部类构造器();
范例:Outer.Inner in = new Outer().new Inner();
3、成员内部类的访问拓展:
成员内部类中是否可以直接访问外部类的静态成员?
可以,外部类的静态成员只有一份,可以被共享访问。
成员内部类的实例方法是否可以直接访问外部类的实例方法?
可以,因为必须先有外部类对象,才能有成员内部类对象,所以可以直接访问外部类对象的实例成员。
4、成员内部类是什么样的、有什么特点?
无static 修饰,属于外部类对象。
可以直接访问外部类的静态成员,实例方法中可以直接访问外部类的实例成员。
// 外部类
public class People {
private int heartbeat = 120;
// 成员内部类
public class heart {
private int heartbeat = 110;
public void show() {
int heartbeat = 100;
System.out.println(heartbeat); // 100
System.out.println(this.heartbeat); // 110
System.out.println(People.this.heartbeat); // 120
}
}
public static void main(String[] args) {
People.heart inner = new People().new heart();
inner.show();
}
}
注意:在成员内部类的内部访问外部类的成员变量,使用外部类名.this.成员变量。如果是静态成员变量,则使用外部类名.成员变量。
What will be the output of the below program?
class A {
static String s = "AAA";
void methodA() {
System.out.println("methodA");
}
class B {
String s = "BBB";
void methodB() {
String s = "CCC";
System.out.println(s); // 局部变量
System.out.println(this.s); // 内部类的成员变量
System.out.println(A.s); // 外部类的静态成员变量
new A().methodA(); // 外部类的成员方法
}
}
//静态内部类
public static class StaticInner {
{
System.out.println("static inner class");
}
}
}
public class MainClass {
public static void main(String[] args) {
A a = new A();
System.out.println(A.s); // 类的静态变量
A.B b = a.new B(); // 创建内部成员类的对象实例
System.out.println(b.s); // 内部成员类的对象实例的成员变量
b.methodB();
}
}
AAA
BBB
CCC
BBB
AAA
methodA