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

}
È stato utile?

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

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top