我读到不可能从构造函数为私有(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 中的嵌套类的更多信息。
这可以编译,因为 A
和 B
是内部类,它们是嵌套类 (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();
}
}
}
这可以编译,因为 A
和 B
是静态嵌套类(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/