非静态内部类的构造器

有如下程序

public class Outer{
    public static void main(String args[])throws Exception{
        new Outer().test();
    }
    public void test()throws Exception{
        //创建非静态内部类对象
        System.out.println(new Inner());
        //使用反射方式创建内部类对象
        System.out.println(Inner.class.newInstance());
    }
    public class Inner{
        public String toString(){
            return "Inner对象";
        }
    }
}

 

我们 发现直接创建的内部类对象完全正常,但是通过反射创建的内部类对象抛出了异常。

 

我们对内部类进行反编译

我们发现,非静态内部类并没有无参数的构造器,表面上调用Inner的无参数的构造器创建实例,实际上JVM会将this(代表当前默认的Outer对象)作为实参

传入Inner构造器。

这符合非静态内部类的规则:非静态内部类必须寄生在外部类的实例中,没有外部类的对象,就不能产生非静态内部类的对象。因此,非静态内部类不可能有无参数构造器。

当程序通过反射指定调用Inner类无参数的构造器创建对象,导致异常。

posted @ 2016-04-04 13:05  zerocoin  阅读(536)  评论(0编辑  收藏  举报