为什么我能够在子类中继承并调用私有构造函数?
Why am I able to inherit & call a private constructor in a subclass?
我读到不可能从构造函数是私有的 class 创建子 class,但奇怪的是我能够做到,这个片段还有更多内容吗?
请哪位大神给个通俗易懂的解释。
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。
因为您的 classes 都是 嵌套的 classes(在您的情况下,特别是 inner classes),这意味着它们都是包含 class 的一部分,因此可以访问包含 class 的所有私有内容,包括彼此的私有位。
如果它们不是嵌套的 classes,您将无法访问 subclass.[=24= 中的 superclass 的私有构造函数]
有关 Oracle Java 站点 nested class tutorial 中嵌套 class 的更多信息。
这个可以编译,因为A
和B
是内部的classes,它们是嵌套的classes (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
是 static 嵌套的 classes (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
的构造函数是私有的; 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
}
}
我读到不可能从构造函数是私有的 class 创建子 class,但奇怪的是我能够做到,这个片段还有更多内容吗?
请哪位大神给个通俗易懂的解释。
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。
因为您的 classes 都是 嵌套的 classes(在您的情况下,特别是 inner classes),这意味着它们都是包含 class 的一部分,因此可以访问包含 class 的所有私有内容,包括彼此的私有位。
如果它们不是嵌套的 classes,您将无法访问 subclass.[=24= 中的 superclass 的私有构造函数]
有关 Oracle Java 站点 nested class tutorial 中嵌套 class 的更多信息。
这个可以编译,因为A
和B
是内部的classes,它们是嵌套的classes (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
是 static 嵌套的 classes (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
的构造函数是私有的; 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
}
}