2010-11-15 13 views
7

Ho una domanda per principianti Java: Parent.print() stampa "hallo" nella console, ma anche Child.print() stampa "hallo". Ho pensato di stampare "bambino". Come posso risolvere questo?Java estende l'esempio

public class Parent { 

    private String output = "hallo"; 

    public void print() { 
     System.out.println(output); 
    } 

} 

public class Child extends Parent { 

    private String output = "child"; 

} 

risposta

7

Attualmente hai due variabili distinte, e il codice in Parent conosce solo Parent.output. È necessario impostare il valore di Parent.output su "figlio". Per 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"); 
    } 
} 

tutto dipende da cosa si vuole fare.

+0

ok, funziona, ma indosso non capisco perché il mio tentativo non è in grado di lavorare .... –

+0

@ Martin: A causa stavi creando una variabile completamente separata e impostando il valore di * that * in 'Child'. La classe 'Parent' non è a conoscenza della variabile in' Child'. –

3

Child non hanno accesso alla variabile output esempio Parent s' perché è private. Quello che devi fare è renderlo protected e nel costruttore di Child impostare 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(); 
} 
0

Il motivo per cui child non sta stampando "child" è che in ereditarietà in java, solo i metodi sono ereditati, non i campi. La variabile output non viene sovrascritta dal bambino.

Si potrebbe fare così:

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 c'è bisogno di essere nomi diversi, ma l'ho fatto qui 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 sul valore desiderato. In questo modo si implementa la funzione di stampa solo una volta e non è necessario un metodo sovrascritto duplicato.

0

Quando stavo cercando di capire la parola chiave est, stavo usando due classi. Spero che ti aiuterà anche 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(); 
    } 

}