В чем разница между super(variable-name); и super.variableName = something; в конструкторе, когда вы хотите инициализировать параметры и хотите назначить один из них переменной родительского класса?
например, я хочу реализовать конструктор «Zahnradfraese», и он принимает параметр «int Kennung», и этот параметр должен быть назначен атрибуту «kennung» родительского класса «Produktionmittel»
Должен ли я всегда использовать super, когда я хочу вызвать переменную из этого родительского класса, или я просто использую его, если у меня есть другая переменная с тем же именем в дочернем классе?




What is the difference between
super(variableName);andsuper.variableName = something;?
method() (здесь super(variableName)) - это вызов метода (здесь вызов родительского конструктора).
super.variableName = something; - это присвоение родительскому полю.
Should I always use
superwhen 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
Zahnradfraeseand it takes the parameterint Kennungand this parameter should be assigned to the attributekennungof the parent classProduktionmittel.
Добавьте конструктор в Produktionmittel, который принимает int
public Produktionmittel(int i) {
kennung = i;
}
и назовите его от ребенка:
public Zahnradfraese(int kennung) {
super(kennung);
}
спасибо за ваш ответ, я не понял, что вы имеете в виду под super (variableName) может инициализировать внутреннее состояние родителя. не могли бы вы объяснить это поподробнее? и у меня нет возможности добавить конструктор в Produktionmittel
@Sengo внутреннее состояние объекта - это состояние всех полей, которыми он обладает.
@Sengo один аргумент конструктора может влиять на более чем 1 поле (например, он может устанавливать одно поле и участвовать в вычислениях для другого)
@Sengo, если вы не можете добавить конструктор к родительскому, то super.variable = value; - единственный вариант.
Итак, 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, он выполнит (не компилирует) конструктор Test
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, ты прав. В вашем случае дочерний класс имеет доступ к методу родительского класса, поэтому вы можете это сделать.
поскольку вы не можете изменять класс kennung, вы можете использовать
super.setKennung(kennung)внутри конструктора классаZahnradfraese.