Loading

Java内部类

在Java中允许一个类定义在另一个类的内部,前者称为内部类,后者称为外部类。

内部类可以分为:成员内部类(static成员内部类和非static成员内部类)和局部内部类(方法内、代码块内、构造器内)

成员内部类

作为外部类的成员:

(1)调用外部类的结构

(2)可以被static修饰

(3)可以被4种不同的权限修饰

作为一个类:

(1)类内可以定义属性、方法、构造器等

(2)可以被final修饰,表示此类不能被继承

(3)可以被abstract修饰

public class InnerClassTest {
    public static void main(String[] args) {
        //创建Dog实例(静态的成员内部类)
        Person.Dog dog = new Person.Dog();
        dog.show();

        //创建Bird实例(非静态的成员内部类)
        Person p = new Person();
        Person.Bird bird = p.new Bird();
        bird.sing();
        bird.display("小小鸟");

    }

}

class Person {
    String name = "小明";
    int age;

    public void eat() {
        System.out.println("人吃饭");
    }

    //静态成员内部类
    static class Dog {
        String name;
        int age;

        public void show() {
            System.out.println("你是一条狗");
        }

    }

    //非静态成员内部类
    class Bird {
        String name = "麻雀";

        public Bird() {
        }

        public void sing() {
            System.out.println("我是一只小小鸟");
            Person.this.eat();
        }

        public void display(String name) {
            System.out.println(name); //方法的形参
            System.out.println(this.name); //内部类属性
            System.out.println(Person.this.name); //外部类的属性
        }
    }


    public void method() {
        //局部内部类
        class AA {

        }
    }

    {
        //局部内部类
        class BB {

        }
    }

    public Person() {
        //局部内部类
        class CC {

        }
    }
}

局部内部类

public class InnerClassTest1 {
    public void method() {
        int num = 10;
        //局部内部类
        class AA {
            public void show(){
                //编译不通过
//                num = 20;
                System.out.println(num);
                
            }
        }
    }
    //返回了一个实现了comparable接口的类的对象
    public Comparable getComparable(){
        //方式1:
        //创建一个实现了Comparable接口的类:局部内部类
//        class MyComparable implements Comparable{
//            @Override
//            public int compareTo(Object o) {
//                return 0;
//            }
//        }
//        return new MyComparable();
        //方式2:
        return new Comparable() {
            @Override
            public int compareTo(Object o) {
                return 0;
            }
        };

    }
}

在局部内部类的方法(比如show)中如果调用局部内部类所声明的方法(比如method)中的局部变量(比如num),要求此局部变量是final的。在JDK8及之后可以省略final的声明

posted @ 2021-10-25 11:16  charlatte  阅读(36)  评论(0编辑  收藏  举报