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

Difference between super(variableName) ; and super.variableName

构造函数中 super(variable-name);super.variableName = something; 之间的区别是什么,当您想初始化参数并且想将其中一个参数分配给父变量时class?

例如我想实现 "Zahnradfraese" 的构造函数,它接受参数 "int Kennung" 并且这个参数应该分配给父 [=24] 的属性 "kennung" =] "Produktionmittel"

当我想从这个父 class 调用一个变量时,我应该总是使用 super 还是如果我在子 class 中有另一个同名变量,我就使用它?

What is the difference between super(variableName); and super.variableName = something;?

method()(这里是super(variableName))是方法调用(这里是parent的构造函数调用)。

super.variableName = something; 是对 parent 字段的分配。

Should I always use super when I wanna call a variable from this parent class or I just use it if I have another variable with the same name in the child class?

super(variableName) 可以初始化 parent 的内部状态,特别是 super.variableName。在访问它之前初始化一个 super.variableName 是合理的。您列出的两种方式都可以用于此目的。只要确保没有代码重复即可。

I want to implement the constructor of the Zahnradfraese and it takes the parameter int Kennung and this parameter should be assigned to the attribute kennung of the parent class Produktionmittel.

Produktionmittel 添加构造函数,它接受 int

public Produktionmittel(int i) {
    kennung = i;
}

并从 child:

调用它
public Zahnradfraese(int kennung) {
    super(kennung);
}

因此 super(variableName) 正在调用您的父 class 一个 arg 构造函数,并且该逻辑得到执行

super.variableName = something; 正在将 something 值分配给父 class 变量 variableName

super() 是一个关键字,用于在父 class 中调用构造函数,并且必须从子 class 的构造函数中调用它。也必须是第一个语句。

其中 super.s 用于从子 class 设置变量 s(在父 class 中声明)并且它没有限制同上。

见下例:

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;
    }
}

super(arg)调用superclass的构造函数,设置变量只是设置变量。 (构造函数可能包含比分配变量更多的逻辑,您可以用第二种方式绕过)

简单示例:

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{

}

C 中调用 super("x") 也会设置布尔标志,作为父级 class "might expect" 它。调用 super.variable1="x" 不会影响布尔标志,并且您无法更改它,因为它是私有的。

根据经验,我会说:如果某个变量有专用的构造函数,似乎值得使用它,除非您确实想覆盖该实现。

super(variable_name) 表示构造函数调用,应该在构造函数的第一行。而 super.variableName = something; 意味着您正在使用 super 从子 class 为父 class 的实例变量赋值,该值用于引用父 class 对象.

现在你的情况:根据给定的 class-图表 class Zahnradfraese 有一个带有 int Kennung 参数的构造函数。此外,kennung 是父级 -class 并且没有构造函数,而是具有方法 setKennung()。所以你可以在 Zahnradfraese class 的构造函数中执行 super.setKennung(kennung)。您也可以在 kennung 中声明一个构造函数,但这意味着偏离 class-diagram,它有 setter 和 getter 方法但没有构造函数。

public class Zahnradfraese extends Kennung{
  public Zahnradfraese(int kennung){
    super.setKennung(kennung);
  }
}