Разница между супер (variableName); и super.variableName - PullRequest
0 голосов
/ 16 сентября 2018

enter image description here В чем разница между super(variable-name); и super.variableName = something; в конструкторе, когда вы хотите инициализировать параметры и хотите присвоить один из них переменной родительского класса?

например, я хочу реализовать конструктор "Zahnradfraese", и он принимает параметр "int Kennung", и этот параметр должен быть назначен атрибуту "kennung" родительского класса "Produktionmittel"

Должен ли я всегда использовать super, когда хочу вызвать переменную из этого родительского класса, или я просто использую ее, если у меня есть другая переменная с тем же именем в дочернем классе?

Ответы [ 5 ]

0 голосов
/ 16 сентября 2018

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);
  }
}
0 голосов
/ 16 сентября 2018

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" не повлияет на логический флаг, и вы не можете изменить его, потому что он является личным.

Как правило, я бы сказал: если для определенной переменной есть выделенный конструктор, его стоит использовать, если только вы не хотите переопределить эту реализацию.

0 голосов
/ 16 сентября 2018

Итак, super(variableName) вызывает ваш родительский класс конструктор arg, и эта логика получает

super.variableName = something; присваивает something значение родительской переменной класса variableName

0 голосов
/ 16 сентября 2018

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;
    }
}
0 голосов
/ 16 сентября 2018

В чем разница между 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...