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