【java基础】内部类详解学习笔记

OK,先来看下内部类的定义是什么?顾名思义啊,内部类就是一个定义在类或者方法里面的类,像寄生虫一样,就像:

class C{
    class D{
    .......
    }
}

上面的类D就是属于一个内部类,而类C相对而言就是一个外部类。

然而,内部类还分为四种:成员内部类局部内部类匿名内部类静态内部类。

(对于分类这个东西,常常是会忘掉的,但是呢,我有强迫症,所以我想把它们的分类给记住,所以我编个四字成语 “橙橘逆境”(成局匿静)玩个谐音来加强记忆,橙子橘子在内部遭遇着逆境。)

成员内部类

成员内部类,定义在另一个类中。OK,那么成员内部类有什么特点呢?

成员内部类可以无条件访问外部类的属性和方法

class C{
    private String name = "外部类的属性";
    public void run(){
        System.out.println("外部类的方法");
    }
    class D{
        public void say(){
            System.out.println(name);
            run();
        }
    }
}

但是外部类想要访问内部类的属性和方法就必须要,先创建一个内部类对象,通过对象去访问内部类的属性和方法

class C{
    private String name = "外部类的属性";
    public void run(){
        System.out.println("外部类的方法");
    }
    /*使用内部类的属性和方法*/
    public void eat(){
        D d = new D();
        System.out.println(d.value);
        d.say();
    }
    class D{
        private String value = "内部类属性";
        public void say(){
            System.out.println(name);
            run();
        }
    }
}

如果成员内部类的属性或者方法与外部类的同名,将导致外部类的这些属性与方法在内部类被隐藏,也可按照该格式调用,外部类.this.属性/方法

class C{
    private String name = "外部类";
    public void run(){
        System.out.println("外部类奔跑");
    }
    /*使用内部类的属性和方法*/
    public void eat(){
        D d = new D();
        System.out.println(d.value);
        d.say();
    }
    class D{
        private String value = "DDD";
        private String name = "内部类";
        public void say(){
            System.out.println(C.this.name);
            System.out.println(name);
            run();
        }
    }
}

然后是创建内部类的两种方式,显然成员内部类是寄生于外部类的,创建内部类对象就必须先创造外部类。

public class Test10 {
    public static void main(String[] args) {
        /*方式1创建成员内部类对象*/
        C c = new C();
        C.D d = c.new D();
        /*方式2创建成员内部类对象*/
        C.D d1 = c.getClassD();
    }
}
class C{
    private String name = "外部类";
    public void run(){
        System.out.println("外部类奔跑");
    }
    /*创建一个返回D对象的方法*/
    public D getClassD(){
        return new D();
    }
    /*使用内部类的属性和方法*/
    public void eat(){
        D d = new D();
        System.out.println(d.value);
        d.say();
    }
    class D{
        private String value = "DDD";
        private String name = "内部类";
        public void say(){
            System.out.println(C.this.name);
            System.out.println(name);
            run();
        }
    }
}

成员内部类前可加上四种访问修饰符。
private:仅外部类可访问。
protected:同包下或继承类可访问。
default:同包下可访问。
public:所有类可访问。

局部内部类

局部内部类存在于方法中。
他和成员内部类的区别在于局部内部类的访问权限仅限于方法或作用域内。

class K{
    public void say(){
        class J{
            
        }
    }
}

注意事项:局部内部类就像局部变量一样,前面不能访问修饰符以及static修饰符。

匿名内部类

下面我们先通过一段代码初步了解一下匿名内部类。

public class Test13 {
    public static void main(String[] args) {
        driveCar(new Car(){
            @Override
            public void drive() {
                System.out.println("驾驶着BMW汽车");
            }
        });
    }
    public static void driveCar(Car car){
        car.drive();
    }
}

interface Car {
    void drive();
}

分析以上代码知道静态方法driveCar需要一个Car对象,我们通过实现接口创建一个匿名类对象传递过去。事实上还可以通过继承类来创建一个匿名内部类对象。
注意事项:匿名内部类没有构造方法。也是唯一没有构造方法的内部类。匿名内部类和局部内部类只能访问外部类的final变量。

 

posted @ 2021-06-22 15:27  leehwayou  阅读(82)  评论(0)    收藏  举报