Это концепция объектно-ориентированного программирования (ООП), называемая наследованием.Родительский класс определяет конкретное поведение, а дочерний класс может изменить его поведение.Когда вы определяете метод с такой же сигнатурой в дочернем классе, говорят, что дочерний класс переопределяет поведение, определенное его родительским классом.
Когда вы вызываете this.sameMethod()
вродительский класс A
, он будет вызывать sameMethod()
, определенный в B
, потому что метод уже был redefined
.
В вашем случае, похоже, что ваш дочерний класс должен что-то сделать дополнительный поверх того, что сделал его родитель.
class A{
public A(){
this.sameMethod();
}
public void sameMethod(){
System.out.println("This is A");
}
}
class B extends A{
private int i;
public B(int i){
// Parent class has already called this, you don't do this here
// this.sameMethod();
this.i = i; // You really need this
}
public void sameMethod(){
super.sameMethod(); // This means that the child class also does whatever its parent does
System.out.println("This is B");
System.out.println("int value: " + i);
}
}
Я бы сказал, что вызов sameMethod()
для конструкторов на разных уровнях - это , как правило, плохая идея.Если базовый класс (или родительский класс) вызывает определенный метод в своем конструкторе, существует неявное соглашение, что все экземпляры должны что-то делать один раз , чтобы что-то инициализировать.Знание того, что ваш родитель уже делает это, и вы также пытаетесь сделать что-то подобное , может вызвать замешательство, когда кто-то еще смотрит на ваш код.Если он должен сделать что-то дополнительное, определенно более ясно иметь другой метод, который подкласс может также вызывать в своем конструкторе.
Пример:
class Diner {
public Diner() {
this.eatWithMouth();
}
public void eatWithMouth() {
System.out.println("Ate something.");
}
}
class ThirstyDiner extends Diner {
public ThirstyDiner() {
super();
this.drinkWater();
}
public void drinkWater() {
System.out.println("Drank something.");
}
}
class ThirstyDiner extends Diner {
public ThirstyDiner() {
super();
this.eatWithMouth();
}
public void eatWithMouth() {
System.out.println("Drank something."); // You don't actually eat anything -> contract violation
}
}
class SlowDiner extends Diner {
public SlowDiner () {
super();
}
public void eatWithMouth() {
super.eatWithMouth();
System.out.println("Took 10 hours."); // At least this is marginally related
}
}