为什么 java 中的 Abstract class 中需要 Protected 构造函数
Why is the need of Protected constructor in Abstract class in java
在查看 java 代码时,我发现抽象 class 的构造函数受到保护。
public abstract class A {
protected A() {
}
}
什么
Abstract means to me is that you can't create the instance of this
class and use this class after extending
。
And protected constructor also ensures that.
做两件事的意义何在,一是让构造函数受保护,二是为了解决相同的目的而制作 class 抽象。
创建构造函数 protected
不会阻止来自同一包的其他 class 或扩展此 class 的其他 class 实例化 class 使用这个构造函数。因此需要 abstract
关键字来防止实例化。
你可以把一个abstract
class的构造函数声明为public
,但是你仍然不能实例化这个class,所以这是没有意义的。另一方面,您的 abstract
class 的 sub-classes 将无法使用 private
构造函数(只有 abstract
[=29= 的其他构造函数] 本身)。因此,abstract
class 的任何构造函数应该对 abstract
class 的所有 sub-classes 可用,应该是 protected
.
当然,在您的特定示例中,根本不需要声明构造函数,因为它有一个空体并且没有其他构造函数。这意味着编译器无论如何都会生成一个空主体的 parameter-less 构造函数。
的确,减少构造函数在抽象 class 中的可见性(从 public
到 protected
)对于代码无法直接实例化抽象 class.
然而,这不是重点。一种构造函数 protected
只是为了控制作用域,就像将成员属性设为私有一样。
这里是相同的 class 的修改版本,表明重点不是防止实例化:
public abstract class A {
protected A() {
this(0);
}
private A(int a) {
// not accessible to anyone but members of A
// the point is not to prevent instantiation, but to restrict access
}
}
如果使构造函数受保护是为了防止实例化,那么有人可能会争辩说实例化在抽象 class 本身或其子classes 中是可能的。
在查看 java 代码时,我发现抽象 class 的构造函数受到保护。
public abstract class A {
protected A() {
}
}
什么
Abstract means to me is that you can't create the instance of this class and use this class after extending
。
And protected constructor also ensures that.
做两件事的意义何在,一是让构造函数受保护,二是为了解决相同的目的而制作 class 抽象。
创建构造函数 protected
不会阻止来自同一包的其他 class 或扩展此 class 的其他 class 实例化 class 使用这个构造函数。因此需要 abstract
关键字来防止实例化。
你可以把一个abstract
class的构造函数声明为public
,但是你仍然不能实例化这个class,所以这是没有意义的。另一方面,您的 abstract
class 的 sub-classes 将无法使用 private
构造函数(只有 abstract
[=29= 的其他构造函数] 本身)。因此,abstract
class 的任何构造函数应该对 abstract
class 的所有 sub-classes 可用,应该是 protected
.
当然,在您的特定示例中,根本不需要声明构造函数,因为它有一个空体并且没有其他构造函数。这意味着编译器无论如何都会生成一个空主体的 parameter-less 构造函数。
的确,减少构造函数在抽象 class 中的可见性(从 public
到 protected
)对于代码无法直接实例化抽象 class.
然而,这不是重点。一种构造函数 protected
只是为了控制作用域,就像将成员属性设为私有一样。
这里是相同的 class 的修改版本,表明重点不是防止实例化:
public abstract class A {
protected A() {
this(0);
}
private A(int a) {
// not accessible to anyone but members of A
// the point is not to prevent instantiation, but to restrict access
}
}
如果使构造函数受保护是为了防止实例化,那么有人可能会争辩说实例化在抽象 class 本身或其子classes 中是可能的。