super(variableName)之间的区别;和super.variableName

时间:2018-09-16 16:20:33

标签: java oop inheritance constructor superclass

enter image description here在构造器中super(variable-name);super.variableName = something;之间的区别是,当您要初始化参数并想将其中一个分配给父类的变量时?

例如,我要实现“ Zahnradfraese”的构造函数,并且需要参数“ int Kennung”,并且应将此参数分配给父类“ Produktionmittel”的属性“ kennung”

当我想从该父类中调用一个变量时,我应该总是使用super还是如果子类中有另一个具有相同名称的变量,则只使用它吗?

5 个答案:

答案 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);
  }
}