关于java中的超级关键字,我有以下问题:
下面有一个课程代码:
B
继承了类A
,所以它必须有两个整数变量i
。类C
继承类B
,因此它将有两个来自B
的整数变量,一个本身定义。现在,我可以通过显示方法在类i
中打印继承的超类变量C
,当然还可以打印在类C
本身中定义的变量。问题是如何打印值为"20“的第三个i
。
我知道我可以在类B中定义一个返回Super.i的方法,并通过它在A类中的对象调用它,该对象将打印第三个变量i,我也知道我可以创建一个A类的对象,但是使用Super或任何其他东西直接访问类C中的第三个变量,还有其他方法吗?
此外,产出如下:
I am in constructor of the parent class
I am in constructor of the subclass
I am in constructor of the main class
40
30
发布于 2015-12-01 07:14:48
除上述所有情况外,还应考虑以下情况:
A.class
和B.class
A.class
,它用旧的A.class
替换现在的问题是:B
怎么知道A
**s的初始化代码已经改变了?**你没有重新编译B
,也不应该被要求这么做。毕竟,B
可能已经打包在一个不同的罐子中,甚至在您无法控制的不同产品中。
支持这种情况的唯一合理方法是,B
s的构造函数从调用A
s构造函数开始,让A
初始化自己。
*一开始这听起来可能有些牵强,但当JDK类的内部实现细节发生变化时,情况正是如此。世界上所有以前编译的Java应用程序都应该与新的JDK无缝地运行。
发布于 2015-11-30 19:52:43
在JLS 第15.11款中详细说明了其中的大部分内容:
15.11.2使用
super
访问超类成员表单super.Identifier引用当前对象的名为标识符的字段,但将当前对象视为当前类超类的实例。
这里的关键词是当前对象的关键字。如果没有当前对象(例如静态方法的情况),则无法使用超级方法。
当涉及构造函数时,超类负责初始化它的字段。这是必要的,因为子类中可能有子类无法访问的私有字段。
此外,要求子类实例化超类的状态可能要求子类拥有比所需的更多的信息,还需要超类和子类之间的更紧密耦合--对超类中字段的任何更改都需要在所有子类中进行更改。这是件坏事。
因此,通过让子类在创建超类时调用超类的构造函数,可以防止这种糟糕的事情发生。
发布于 2015-12-01 04:27:41
您的代码不完整-以下是Java为您添加的内容:
class A extends Object { /* <-- Added */
int i = 20;
A() {
super(); /* <-- Added */
System.out.println("I am in constructor of the parent class");
}
}
你的其他课程也是这样。
所有类都扩展了其他类,即使它是“只是”对象。
"super“指当前实例的超类,但是静态方法没有实例;它们只是”附加“到类的代码块,但不引用实例本身中的任何数据。如果这是一个.Net问题,我会向您指出String类上的Split()和Join()方法;实例 Split方法分解了String对象中的当前值,但是静态连接方法使用分隔符和数组值作为参数,并将它们放在一起。
构造者在他们的行动中本质上是私人的。他们的工作是让对象本身做好工作准备,而不引用它的超类或任何子类(它根本不应该知道这些子类)。实例化在超类“链”上一直运行,一直到对象,并在“后退”的过程中对每个类执行构造函数。
https://softwareengineering.stackexchange.com/questions/303965
复制相似问题