为什么私有构造函数禁止继承?
Why does private constructor prohibits a inheritance?
我知道两种禁止继承的方式:
- 进行决赛class
- 宣布私有构造函数
要防止继承,必须将 class 的 default 构造函数声明为私有。
class Class {
private Class() {}
}
class OtherClass extends Class {
// Error! There is no default constructor available
}
使用 super
的一切都完成了吗?
class Class {
public Class() {}
}
class OtherClass extends Class {
public OtherClass() { super(); } // Did everything done for this opportunity?
}
我想知道为什么您不能从具有私有默认构造函数的 class 继承以及条件是什么?
是不是默认构造函数并不重要。如果 class 的所有构造函数都是私有的,则其子类型的 none 可以具有有效的构造函数,因为所有构造函数都必须调用超类型的构造函数。
在 Java 中,如果您创建 Child Class
的实例,则会隐式创建 Parent Class
实例。
因此 Parent Class
构造函数应该对 Child Class
可见,因为它在第一个语句本身中使用 super()
调用 Parent Class
构造函数的构造函数。
因此,如果将 Parent Class
的构造函数更改为 private
,Child Class
将无法访问它并且无法创建自己的任何实例,因此编译器在第一手只是根本不允许这样做。
但是如果你想在 Parent Class
中使用 private
默认构造函数,那么你需要在 Parent Class
中明确创建一个重载的 public
构造函数,然后在 Child class
构造函数,您需要使用 super(param)
调用 Parent Class
的 public 重载构造函数。
此外,您可能会想 private
构造函数有什么用。 private
构造函数主要用于当您不希望来自任何外部 class 的其他人在您的 class 上调用 new()
时。因此,在这种情况下,我们提供了一些 getter()
方法来提供 class 的 object
。在该方法中,您可以 create/use 您的 class 的现有对象 & return 它来自那个方法。
例如。 Calendar cal = Calendar.getInstance();
。这实际上构成了 Singleton
设计模式的基础。
我知道两种禁止继承的方式:
- 进行决赛class
- 宣布私有构造函数
要防止继承,必须将 class 的 default 构造函数声明为私有。
class Class {
private Class() {}
}
class OtherClass extends Class {
// Error! There is no default constructor available
}
使用 super
的一切都完成了吗?
class Class {
public Class() {}
}
class OtherClass extends Class {
public OtherClass() { super(); } // Did everything done for this opportunity?
}
我想知道为什么您不能从具有私有默认构造函数的 class 继承以及条件是什么?
是不是默认构造函数并不重要。如果 class 的所有构造函数都是私有的,则其子类型的 none 可以具有有效的构造函数,因为所有构造函数都必须调用超类型的构造函数。
在 Java 中,如果您创建 Child Class
的实例,则会隐式创建 Parent Class
实例。
因此 Parent Class
构造函数应该对 Child Class
可见,因为它在第一个语句本身中使用 super()
调用 Parent Class
构造函数的构造函数。
因此,如果将 Parent Class
的构造函数更改为 private
,Child Class
将无法访问它并且无法创建自己的任何实例,因此编译器在第一手只是根本不允许这样做。
但是如果你想在 Parent Class
中使用 private
默认构造函数,那么你需要在 Parent Class
中明确创建一个重载的 public
构造函数,然后在 Child class
构造函数,您需要使用 super(param)
调用 Parent Class
的 public 重载构造函数。
此外,您可能会想 private
构造函数有什么用。 private
构造函数主要用于当您不希望来自任何外部 class 的其他人在您的 class 上调用 new()
时。因此,在这种情况下,我们提供了一些 getter()
方法来提供 class 的 object
。在该方法中,您可以 create/use 您的 class 的现有对象 & return 它来自那个方法。
例如。 Calendar cal = Calendar.getInstance();
。这实际上构成了 Singleton
设计模式的基础。