Java 内部类 解析

81 阅读1分钟

成员普通内部类

public class Person {
    public int age;

    public Heart getHeart(){
        // 外部类访问内部类需要通过内部类的实例访问 无法直接访问
        int age = new Heart().age;
        return new Heart();
    }

    public void eat(){
        System.out.println("eat now");
    }

    // 内部类无法直接实例化 要借助外部类的实例化才能实例化
    // 内部类可以使用任意的访问修饰符 访问也会收到影响
    // 内部类可以使用外部类的成员 如果出现同名的属性 优先访问内部类中定义的
    // 可以使用 外部类.this.成员来访问外部类中同名的成员信息
    public class Heart{
        // 同名属性
        int age = 18;

        public void GetOutMethod(){
            // 直接调用外部类方法
            eat();
        }

        public void HeartAge(){
            System.out.println(age);
        }

        public void GetSameHeartAge(){
            // Outer.this.成员访问同名外部类成员
            System.out.println(Person.this.age);
        }
    }

    public static void main(String[] args) {
        // new 外部类.new 内部类
        Heart heart = new Person().new Heart();
        // 对象.new 内部类
        Person person = new Person();
        Heart heart1 = person.new Heart();
        // 通过类的方法获取
        Person person1 = new Person();
        Heart heart2 = person1.getHeart();
    }
}

静态内部类

public class People {
    public int age;
    public static int true_age = 18;

    // 静态内部类
    // 只能访问外部类的静态成员 如果要调用非静态成员需要new外部类的实例在调用属性或方法
    public static class Eye {

        public int getAge(){
            // 需要new外部类的实例在调用属性或方法
            return new People().age;// return age;
        }

        public static void SayHello(){
            System.out.println("hello" + true_age);
        }
    }

    public static void main(String[] args) {
        // 静态内部类的获取方法
        // 可以不依赖于外部类的对象
        Eye eye = new People.Eye();
        Eye eye1 = new Eye();
        eye1.getAge();
        Eye.SayHello();
        eye.getAge();
    }
}

方法内部类 不推荐使用

匿名内部类

  • 将类的定义和创建放在一起完成 通常用来简化抽象类和接口实例化的操作