Java расширяет пример
У меня есть вопрос для начинающих Java: Parent.print() печатает "Привет" в консоли, но также Child.print() печатает "Привет". Я думал, что это должно напечатать "ребенок". Как я могу решить это?
public class Parent {
private String output = "hallo";
public void print() {
System.out.println(output);
}
}
public class Child extends Parent {
private String output = "child";
}
4 ответа
В настоящее время у вас есть две отдельные переменные, и код в Parent
знает только о Parent.output
, Вам необходимо установить значение Parent.output
"ребенку". Например:
public class Parent {
private String output = "hallo";
protected void setOutput(String output) {
this.output = output;
}
public void print() {
System.out.println(output );
}
}
public class Child extends Parent {
public Child() {
setOutput("child");
}
}
Альтернативным подходом было бы дать классу Parent конструктор, который получил желаемый результат:
public class Parent {
private String output;
public Parent(String output) {
this.output = output;
}
public Parent() {
this("hallo");
}
public void print() {
System.out.println(output );
}
}
public class Child extends Parent {
public Child() {
super("child");
}
}
Это действительно зависит от того, что вы хотите сделать.
Child
не имеет доступа к Parent
"s output
переменная экземпляра, потому что это private
, Что вам нужно сделать, это сделать это protected
и в конструкторе Child
задавать output
в "child"
,
Другими словами, два output
переменные разные.
Вы также можете сделать это, если вы измените вывод на protected
в Parent
:
public void print(){
output = "child"
super.print();
}
Причина, по которой child не печатает "child", заключается в том, что при наследовании в java наследуются только методы, а не поля. Переменная output
не отменяется ребенком.
Вы можете сделать это так:
public class Parent {
private String parentOutput = "hallo";
String getOutput() {
return output;
}
public void print() {
System.out.println(getOutput());
}
}
public class Child extends Parent {
private String childOutput = "child";
String getOutput() {
return output;
}
}
Кроме того, переменные String не обязательно должны иметь разные имена, но я сделал это здесь для ясности.
Другой, более читаемый способ сделать это:
public class Parent {
protected String output;
public Parent() {
output = "hallo";
}
public void print() {
System.out.println(output);
}
}
public class Child extends Parent {
public Child() {
output = "child";
}
}
В этом примере переменная protected
Это означает, что его можно прочитать как от родителя, так и от ребенка. Конструктор классов устанавливает переменную в желаемое значение. Таким образом, вы реализуете функцию печати только один раз и не нуждаетесь в дублирующем переопределенном методе.
Когда я пытался выяснить ключевое слово extend, я использовал два класса. Я надеюсь, что это также поможет вам понять основную идею.
Parent.java
public class Parent {
private int a1;
private int b1;
public Parent(int a, int b){
this.a1 = a;
this.b1 = b;
}
public void print() {
System.out.println("a1= " + this.a1 + " b1= " + this.b1);
}
}
Child.java
public class Child extends Parent {
public Child(int c1, int d1){
super(c1,d1);
}
public static void main(String[] args) {
Parent pa = new Parent(1,2);
pa.print();
Child ch = new Child(5,6);
ch.print();
}
}