image.png
image.png

成员内部类可以访问外部类的静态成员,实例方法中 可以访问外部类的实例成员

image.png

在内部类定义的方法中要访问外部类对象成员:外部类名.this.当前成员名

image.png

调用成员内部类:

  1. package com.itheima.d6_innerclass;
  2. public class Test {
  3. public static void main(String[] args) {
  4. // 成员内部类是属于外部类对象的(所以创建的时候先new外部类构造器.new内部类构造器)
  5. // 格式:外部类名.内部类名 对象名 = new 外部类构造器().new 内部类构造器()
  6. Outer.Inner in = new Outer().new Inner();
  7. in.setName("lxc");
  8. in.show();
  9. // 成员内部类的静态方法调用,要用:外部类名.内部类名.静态方法名
  10. Outer.Inner.test();
  11. // 用有参构造器创建对象(这样就可以直接给成员变量赋值)
  12. Outer.Inner in1 = new Outer("爱听课").new Inner();
  13. in1.show();
  14. }
  15. }

定义成员内部类

package com.itheima.d6_innerclass;

/**
 * 外部类
 */
public class Outer {
    // 在外部类定义静态成员变量,让成员内部类直接访问
    // 因为外部类的静态成员是只有一份且可以被共享
    public static int num = 111;
    // 定义一个实例成员,让成员内部类直接访问
    // 因为必须先有外部类对象,才能有成员内部类对象,
    // 所以可以直接访问外部类对象的实例成员
    private String hobby;

    public Outer() {
    }

    public Outer(String hobby) {
        this.hobby = hobby;
    }

    /**
     * 成员内部类:不能加static修饰  属于外部类对象的,所以JDK16之前(16支持)不支持静态成员(静态成员是属于类的)
     */
    public class Inner{ // 成员内部类相当于静态内部类区别就是没有static修饰
        private String name;
        private int age;
        public static int a = 100; // JDK 16开始,成员内部类开始支持静态成员了   JDK16之前不支持

        public static void test(){// 成员内部类的静态方法
            System.out.println(a);
        }

        public void show(){
            System.out.println("名称:" + name);
            System.out.println("数量:" + num);
            System.out.println("爱好" + hobby); // 这里访问的是外部成员变量

        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }
    }
}