Java estende esempio
-
10-10-2019 - |
Domanda
Ho una domanda per principianti java: Parent.print () stampa "hallo" nella console, ma anche Child.print () stampe "hallo". Ho pensato che deve stampare "bambino". Come posso risolvere questo problema?
public class Parent {
private String output = "hallo";
public void print() {
System.out.println(output);
}
}
public class Child extends Parent {
private String output = "child";
}
Soluzione
Al momento hai avuto due variabili distinte, e il codice in Parent
conosce solo Parent.output
. È necessario impostare il valore di Parent.output
al "bambino". Ad esempio:
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");
}
}
Un approccio alternativo potrebbe essere quello di dare alla classe Parent un costruttore che ha avuto l'output desiderato:
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");
}
}
Dipende da cosa si vuole fare.
Altri suggerimenti
Child
non ha accesso alla variabile di istanza Parent
di output
perché è private
. Quello che dovete fare è rendere protected
e nel costruttore di set Child
output
a "child"
.
In altre parole, le due variabili output
sono diverse.
Si potrebbe anche fare questo se si cambia l'uscita di essere protected
in Parent
:
public void print(){
output = "child"
super.print();
}
Il motivo per cui bambino non è la stampa "bambino" è che in eredità in java, solo metodi sono ereditati, non campi. Il output
variabile non viene sovrascritto dal bambino.
Si potrebbe fare in questo modo:
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;
}
}
Inoltre, le variabili stringa non hanno bisogno di essere nomi diversi, ma ho fatto ecco per chiarezza.
Un altro modo più leggibile sarebbe quello di fare questo:
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";
}
}
In questo esempio la variabile è protected
, il che significa che può essere letta sia dal genitore e figlio. Il costruttore delle classi imposta la variabile al valore desiderato. In questo modo si implementa solo la funzione di stampa una volta, e non hanno bisogno di un metodo sovrascritto duplicato.
Quando stavo cercando di capire il estendere parola chiave, stavo usando due classi. Mi auguro che anche vi aiuterà a capire l'idea di base.
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();
}
}