【分析】抽象类的非静态内部类

Hello,大家好,我是尘封已久的恨意。

首先,大家应该都知道,抽象类是不可以直接实例化对象的,必须要依靠子类对象向上转型来实例化。

但是抽象类却可以定义非静态内部类,非静态内部类必须依靠外部类对象存在,而此时外部类是一个抽象类,抽象类无法实例化对象,这样一来不就矛盾了吗?


所以,下面用代码来测试一下:

abstract class A{
     

    class B{
     

        public void b(){
     
            System.out.println("B类对象:"+this);
            System.out.println("外部类对象:"+A.this);
            System.out.println("b");
        }

    }

    public void a(){
     

       B b= new B();
       b.b();

    }

}

class C extends A{
     
//因为A类是抽象类,所以利用子类C来实例化对象
}


public class Main {
     
    public static void main(String[] args)throws Exception {
     

    A a=new C();
    a.a();
    


    }
}


运行后的结果:

B类对象:com.myjava.A$B@6e8cf4c6
外部类对象:com.myjava.C@12edcd21
b

我们通过,调用a()方法 实例化内部类B的对象,从B类的b()方法可以看出来当前的B类对象以及外部类对象。

由此可见,这个内部类依靠的外部类的对象是C类的对象。

可以说明,非静态内部类不一定非要依靠外部类对象而存在,也可能依靠外部类的子类对象而存在。

.


然后,再普及一个小知识点,就是接口里面定义的内部类不管你写不写static,一律都是静态内部类。
因为接口里面没有构造器,无法实例化对象,而且接口只能被类实现,不能被类继承。
而抽象类虽然无法实例化对象,但是它的构造器可以为子类对象实例化,并且可以被子类所继承,所以它可以定义非静态内部类。

再多说几句,内部类其实也是一种语法上的假象,编译后会单独变成一个class文件,和普通的类无异,只不过内部类包含一份外部类的引用。

你可能感兴趣的:(抽象类,java)