2010-11-15 5 views
7

J'ai une question débutant java: Parent.print() affiche "hallo" dans la console, mais aussi Child.print() affiche "hallo". Je pensais qu'il fallait imprimer "enfant". Comment puis-je résoudre ce problème?Java étend l'exemple

public class Parent { 

    private String output = "hallo"; 

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

} 

public class Child extends Parent { 

    private String output = "child"; 

} 

Répondre

7

Actuellement, vous avez deux variables distinctes, et le code Parent ne Connaît Parent.output. Vous devez définir la valeur Parent.output sur "enfant". Par exemple:

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

Une autre approche serait de donner à la classe parent un constructeur qui a pris la sortie désirée:

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

Cela dépend vraiment de ce que vous voulez faire.

+0

ok, ça marche, mais je ne comprends pas pourquoi ma tentative ne peut pas travailler .... –

+0

@ Martin: Parce que vous créiez une variable complètement distincte et définissiez la valeur de * this * dans 'Child'. La classe 'Parent' n'est pas consciente de la variable dans' Child'. –

3

Child n'a pas accès à la variable d » instance outputParent parce qu'il est private. Ce que vous devez faire est de le faire protected et dans le constructeur de Child définir output à "child". En d'autres termes, les deux variables output sont différentes. En d'autres termes, les variables output sont différentes.

Vous pouvez aussi le faire si vous changez de sortie pour être protected dans Parent:

public void print(){ 
    output = "child" 
    super.print(); 
} 
0

La raison pour laquelle l'enfant n'imprime pas "enfant" est que dans l'héritage de Java, seules les méthodes sont héritées, pas les champs. La variable output n'est pas remplacée par l'enfant.

Vous pouvez le faire comme ceci:

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

En outre, les variables chaîne ne doivent pas nécessairement être des noms différents, mais je l'ai fait pour plus de clarté.

Une autre, serait beaucoup plus facile à lire pour ce faire:

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

Dans cet exemple, la variable est protected, ce qui signifie qu'il peut être lu à la fois le parent et l'enfant. Le constructeur des classes définit la variable à la valeur désirée. De cette façon, vous n'implémentez la fonction d'impression qu'une seule fois et vous n'avez pas besoin d'une méthode redondante en double.

0

Lorsque j'essayais de comprendre le mot-clé extend, j'utilisais deux classes. J'espère que cela vous aidera aussi à comprendre l'idée de 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(); 
    } 

}