Разница между super (variableName); и super.variableName

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

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

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

поскольку вы не можете изменять класс kennung, вы можете использовать super.setKennung(kennung) внутри конструктора класса Zahnradfraese.

Yug Singh 16.09.2018 18:54
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
247
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

method() (здесь super(variableName)) - это вызов метода (здесь вызов родительского конструктора).

super.variableName = something; - это присвоение родительскому полю.

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) может инициализировать внутреннее состояние родителя, особенно 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;
}

и назовите его от ребенка:

public Zahnradfraese(int kennung) {
    super(kennung);
}

спасибо за ваш ответ, я не понял, что вы имеете в виду под super (variableName) может инициализировать внутреннее состояние родителя. не могли бы вы объяснить это поподробнее? и у меня нет возможности добавить конструктор в Produktionmittel

Sengo 16.09.2018 18:46

@Sengo внутреннее состояние объекта - это состояние всех полей, которыми он обладает.

Andrew Tobilko 16.09.2018 19:08

@Sengo один аргумент конструктора может влиять на более чем 1 поле (например, он может устанавливать одно поле и участвовать в вычислениях для другого)

Andrew Tobilko 16.09.2018 19:11

@Sengo, если вы не можете добавить конструктор к родительскому, то super.variable = value; - единственный вариант.

Andrew Tobilko 16.09.2018 19:12

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

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

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

спасибо за помощь, значит super (8) скомпилирует конструктор класса Test?

Sengo 16.09.2018 18:49

@Sengo, он выполнит (не компилирует) конструктор Test

Andrew Tobilko 16.09.2018 19:14

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

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

Ответ принят как подходящий

super(variable_name) представляет собой вызов конструктора и должен быть первой строкой в ​​конструкторе. В то время как super.variableName = something; означает, что вы присваиваете значение переменной экземпляра родительского класса из дочернего класса, используя super, который используется для ссылки на объекты родительского класса.

Теперь в вашем случае: согласно данной диаграмме классов класс Zahnradfraese имеет конструктор, который принимает аргумент int Kennung. Кроме того, kennung является родительским классом и не имеет конструктора, а вместо него имеет метод setKennung(). Таким образом, вы можете сделать super.setKennung(kennung) из конструктора класса Zahnradfraese. Вы также можете объявить конструктор внутри kennung, но это будет означать отклонение от диаграммы классов, в которой есть методы установки и получения, но нет конструктора.

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

Большой! спасибо, еще один вопрос, пожалуйста, в этом случае, если я использую setKennung, super не повлияет? я имею в виду, потому что Zahnradfraese расширяет Produktionmittel, так что у него есть доступ к его методам, верно? и если бы мне понравилось, super.kennung = sth будет делать то же самое?

Sengo 16.09.2018 19:05

@Sengo, ты прав. В вашем случае дочерний класс имеет доступ к методу родительского класса, поэтому вы можете это сделать.

Yug Singh 16.09.2018 19:11

Другие вопросы по теме