java - 为什么我可以在子类中继承并调用私有(private)构造函数?

标签 java subclass private-constructor

我读到不可能从构造函数为私有(private)的类创建子类,但奇怪的是我能够做到这一点,这个片段还有更多内容吗?

请有人提供一个易于理解且令人满意的解释。

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。

最佳答案

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

如果它们不是嵌套类,您将无法在子类中访问父类(super class)的私有(private)构造函数。

有关 Oracle Java 站点上的 nested class tutorial 中的嵌套类的更多信息。

这可以编译,因为 AB 是内部类,它们是嵌套类 (live copy):

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静态嵌套类(live copy):

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的构造函数是私有(private)的; B 无法访问它(在这种情况下,我真的不需要 Example,但我已将其包含在上面的两个中,因此对于上下文...)( live copy ):

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
    }
}

关于java - 为什么我可以在子类中继承并调用私有(private)构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38945400/

相关文章:

java - 如何在 Android 中声明常量而不使用 public static final

scala - 在宏中使用私有(private)构造函数

java - 从 GZIPInputStream 读取最后 *n* 行

java - 如何使用 OpenCV Java 将视频分割成帧?

python - 列出 namedtuple 子类的属性

java - 抽象方法和类 : Concept behind?

C++、多态和迭代器

java - 抽象类与私有(private)构造函数

java - JaCoCo 和私有(private)默认构造函数的遗漏

java - 缺少类 LiveDataReactiveStreams