为什么我可以在子类中继承和调用私有构造函数?



我读到,它是不可能创建一个子类从一个类的构造函数是私有的,但奇怪的是,我能够做到这一点,是不是有更多的东西到这个片段?

请提供一个容易理解的&令人满意的解释。

public class app {
    public static void main(String[] args) {
        app ref = new app();
        myInheritedClass myVal = ref.new myInheritedClass(10);
        myVal.show();
    }
    int myValue = 100;
    class myClass {
        int data;
        private myClass(int data) {
            this.data = data;
        }
    }
    class myInheritedClass extends myClass {
        public myInheritedClass(int data) {
            super(data);
        }
        public void show() {
            System.out.println(data);
        }
    }
}

我在https://www.compilejava.net/上运行这个代码片段,输出是10.

因为你的类都是嵌套类(在你的例子中,特别是内部类),这意味着它们都是包含类的一部分,因此可以访问包含类中的所有私有内容,包括彼此的私有位。

如果它们不是嵌套类,你就不能在子类中访问父类的私有构造函数。

关于嵌套类的更多信息,请参见Oracle Java网站上的嵌套类教程。

可以编译,因为AB是内部类,它们是嵌套类(活动副本):

class Example
{
    public static void main (String[] args) throws java.lang.Exception
    {
        System.out.println("Ran at " + new java.util.Date());
    }
    class A {
        private A() {
        }
    }
    class B extends A {
        private B() {
            super();
        }
    }
}

可以编译,因为AB静态嵌套类(活动副本):

class Example
{
    public static void main (String[] args) throws java.lang.Exception
    {
        System.out.println("Ran at " + new java.util.Date());
    }
    static class A {
        private A() {
        }
    }
    static class B extends A {
        private B() {
            super();
        }
    }
}

这个不能编译,因为A的构造函数是私有的;B不能访问它(在这种情况下我真的不需要Example,但我已经把它包括在上面两个,所以为了上下文中…)(实时复制):

class Example
{
    public static void main (String[] args) throws java.lang.Exception
    {
        System.out.println("Ran at " + new java.util.Date());
    }
}
class A {
    private A() {
    }
}
class B extends A {
    private B() {
        super();    // COMPILATION FAILS HERE
    }
}

相关内容

  • 没有找到相关文章

最新更新