在构造器中super(variable-name);
和super.variableName = something;
之间的区别是,当您要初始化参数并想将其中一个分配给父类的变量时?
例如,我要实现“ Zahnradfraese”的构造函数,并且需要参数“ int Kennung”,并且应将此参数分配给父类“ Produktionmittel”的属性“ kennung”
当我想从该父类中调用一个变量时,我应该总是使用super还是如果子类中有另一个具有相同名称的变量,则只使用它吗?
答案 0 :(得分:2)
super(variableName);
和super.variableName = something;
有什么区别?
method()
(此处为super(variableName)
)是方法调用(此处为父级的构造函数调用)。
super.variableName = something;
是对父级字段的分配。
当我想从该父类中调用一个变量时应该总是使用
super
还是在子类中有另一个同名变量时才使用它?
super(variableName)
可以初始化父对象的内部状态,尤其是super.variableName
。在访问super.variableName
之前初始化它是合理的。您列出的两种方式均可用于此目的。只要确保没有代码重复即可。
我想实现
Zahnradfraese
的构造函数,它需要参数int Kennung
,并且应该将此参数分配给父类kennung
的属性Produktionmittel
。
将Produktionmittel
添加到int
的构造函数中
public Produktionmittel(int i) {
kennung = i;
}
并从孩子那里叫它:
public Zahnradfraese(int kennung) {
super(kennung);
}
答案 1 :(得分:1)
所以super(variableName)
正在调用父类的一个arg构造函数,并且该逻辑得以执行
super.variableName = something;
正在将something
的值分配给父类变量variableName
答案 2 :(得分:1)
super()
是一个关键字,用于在父类中调用构造函数,并且必须从子类的构造函数内部调用它。另外,它必须是第一个语句。
其中super.s
用于设置子类的变量s
(在父类中声明),并且没有上述限制。
请参见以下示例:
class Test {
int s;
Test(int d) {
}
}
class T extends Test {
T() {
super(8);
int d = 99;
super.s = 00;
}
void ss() {
super.s = 99;
}
}
答案 3 :(得分:1)
super(arg)调用超类的构造函数,设置变量只是设置变量。 (构造函数可能包含的逻辑不只是分配变量,还可以使用第二种方法绕过该逻辑)
简单的示例:
public class P{
protected String variable1;
private boolean variableInitialized = false;
public P (String s){
this.variable1 = s;
this.variableInitialized=true;
}
}
public class C extends P{
}
在super("x")
中调用C
也会设置布尔标志,因为父类“可能期望”它。调用super.variable1="x"
不会影响布尔标志,并且您不能更改它,因为它是私有的。
根据经验,我会说:如果某个变量有专用的构造函数,那么除非您确实想覆盖该实现,否则似乎值得使用它。
答案 4 :(得分:1)
super(variable_name)
表示构造函数调用,应为构造函数的第一行。 super.variableName = something;
意味着您正在使用super
向子类中的父类的实例变量分配一个值,该变量用于引用父类对象。
现在就您而言:按照给定的类图
类Zahnradfraese
的构造函数带有int Kennung
参数。另外,kennung
是父类,没有构造函数,而是具有方法setKennung()
。因此,您可以从super.setKennung(kennung)
类的构造函数中进行Zahnradfraese
的操作。您还可以在kennung
内声明一个构造函数,但这将意味着偏离具有setter和getter方法且没有构造函数的类图。
public class Zahnradfraese extends Kennung{
public Zahnradfraese(int kennung){
super.setKennung(kennung);
}
}