繁体   English   中英

内部类的默认构造函数是否需要外部类的对象?

[英]Does default constructor for inner class need an object of an outer class?

我在摆弄Java,并创建了两个类, Outer类和Inner

public class Outer {
    public class Inner { 
    }
}

内部类正在使用默认构造函数。 我可以通过调用非参数默认构造函数new Inner()Outer创建Inner类的新实例。 但是当我尝试使用反射来做同样的事情时,我注意到构造函数需要Outer类型对象。

这是否意味着内部类默认构造函数不是non-args? 为什么正常调用构造函数和反射之间不相交?

在“以正常方式调用构造函数和反射之间没有脱节”,只有在从Outer类内部和从Outer类外部调用构造函数之间没有。

由于Inner类不是static ,因此它具有对Outer的引用。 如果要从Outer外部创建Inner实例,则必须这样编写:

Outer outerObj = new Outer();
Outer.Inner innerObj = outerObj.new Inner();

提供要求outerObj到的构造函数Inner是完全一样的,当你实例化的Inner通过反射类。 唯一的区别是语法在操作符new的左侧放置了outerObj ,而反射将outerObj传递给了构造函数。 Java编译器向其自动生成的构造函数中添加了一个隐藏参数,其方式与向已生成的类中添加隐藏字段以保持对Outer对象的引用相同。

请注意,这仅适用于非静态内部类。 当内部类为static ,没有隐藏的参数,也没有隐藏的字段,因此反射使您可以创建内部类的实例而无需使用Outer对象。

内部类不是静态的,因此只有在拥有外部对象时才能创建内部实例。

我可以在外部内部创建新的内部类实例,只需调用非参数默认构造函数new Inner()

里面是的,但他不会编译外或从一个静态方法外Outer

new Outer.Inner();

这是因为当您在Outer内部调用new Inner()this隐式传递给了构造函数,使得:

public class Outer {
    public class Inner {
    }

    public example(){
        new Inner();
    }
}

等效于此静态版本:

public class Outer {
    public static class Inner {
        private Outer mOuter;
        public Inner(Outer outer){
            mOuter = outer;
        }
    }

    public example(){
        new Inner(this);
    }
}

Outer的隐藏引用允许内部调用Outer方法,就好像它们是自己的一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM