下午好,在我的项目中,我有以下抽象类的属性和构造函数:
//Attributes
private int number;
//Constructor
public Card ( int number ) {
this.number = number ;
}
它从中继承以下类:
public abstract class SpainCard extends Card {
//Attributes
private int number ;
private String suit ;
//Constructor
public SpainCard(int number, String suit) {
super(number);
this.suit = suit;
}
我的查询如下,它super(number);
在 my 的构造函数中生成保留字Abstract class SpainCard
?我是继承了父亲的属性int number
,class
还是JAVA在使用时在内部做了什么super();
?。
这是一个查询,以便您可以更好地了解它是如何工作的,并且它的使用方式很好,super();
因为我的代码是这样工作的,但我对它的确切作用存有疑问。
非常感谢,希望你能详细解释一下。
很容易测试它:
打印
0
。也就是说,父级的构造函数 (Card
) 使用了它自己的属性。这是合乎逻辑的。未number
分配子属性。它只是使用这些参数调用父级的构造函数。现在,父级的构造函数在编译时“知道”在语句
this.number = number ;
中左侧的属性是“其”属性。当这个构造函数被执行时,它并没有改变任何东西,实际上正在构建一个子类的对象,它具有自己的同名属性。使用的特定属性(字段)是在编译时设置的。Java中没有属性覆盖之类的东西,只有方法。我希望你很清楚,在两个类(一个扩展另一个类)中使用相同的私有属性本身并不是一个错误,但它是不可取的。
进一步澄清:
您应该能够预测(测验问题!)这会打印什么。
我认为Java文档解释得很清楚,问题是它是英文的。
我允许自己在这里翻译它,以帮助未来的程序员理解它,因为这是一个有趣的问题,尤其是当我们开始使用 Java 编程时。
super关键字的使用
访问超类成员
如果您的方法覆盖了超类的方法之一,则可以使用关键字调用覆盖方法
super
。您也可以使用super
来引用隐藏字段(尽管不鼓励隐藏字段)。考虑这个类
Superclase
:这是一个名为 的子类,
Subclase
它替换(覆盖)printMethod ()
:这是一个名为 Subclass 的子类,它覆盖了 printMethod():
在子类中,简单名称
printMethod()
是指在子类中声明的名称,它取代了超类。因此,要引用从printMethod()
继承Superclase
,Subclase
您必须使用限定名称,使用super
如图所示。当我们编译并运行 aSubclase
时,它会打印以下内容:子类构造函数
以下示例说明了如何使用关键字
super
来调用超类的构造函数。回想一下这个例子Bicycle
,它MountainBike
是 的子类Bicycle
。这MountainBike
是调用超类的构造函数然后添加自己的初始化代码的构造函数(子类):超类构造函数的调用必须是子类构造函数的第一行。
调用超类构造函数的语法是
任何一个:
使用
super()
,调用超类的无参数构造函数。使用super (lista de parámetros)
,使用相应的参数列表调用超类构造函数。如果子类构造函数显式或隐式调用其超类的构造函数,您可以想象将调用整个构造函数链,一直到 Object 的构造函数。事实上,情况就是这样。它被称为构造函数链接,当有很长的类下降线时,您需要注意它。
您在此代码段中的代码:
在 Java 中,当创建 Class 的实例时,会调用构造函数,并且其第一行的构造函数使用 super() 调用父类的构造函数;
让我们看一些例子