2010-11-15 5 views
7

tengo una pregunta para principiantes java: Parent.print() imprime "hola" en la consola, pero también Child.print() imprime "hola". Pensé que tenía que imprimir "niño". ¿Cómo puedo resolver esto?Java extiende el ejemplo

public class Parent { 

    private String output = "hallo"; 

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

} 

public class Child extends Parent { 

    private String output = "child"; 

} 

Respuesta

7

Actualmente tienes dos variables independientes, y el código de Parent sólo conoce Parent.output. Debe establecer el valor de Parent.output en "hijo". Por ejemplo:

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 enfoque alternativo sería dar la clase padre de un constructor que se llevó a la salida deseada:

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

Realmente depende de lo que quiere hacer.

+0

bien, funciona, pero yo no entiendo por qué no mi intento no es capaz de trabajar .... –

+0

@ Martin: Porque Estabas creando una variable completamente separada y estableciendo el valor de * that * en 'Child'. La clase 'Parent' no tiene conocimiento de la variable en' Child'. –

3

Child no tiene acceso a la variable de instancia outputParent 's porque es private. Lo que necesita hacer es hacerlo protected y en el constructor de Child establecer output en "child".

En otras palabras, las dos variables output son diferentes.

También puede hacer esto si cambia de salida sea protected en Parent:

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

La razón por la cual child no está imprimiendo "child" es que en herencia en java, solo los métodos son heredados, no campos. La variable output no es anulada por el niño.

Se podía hacerlo de esta manera:

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

Además, las variables de cadena no necesitan ser diferentes nombres, pero lo he hecho aquí para mayor claridad.

Otra forma más legible sería hacer esto:

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

En este ejemplo, la variable es protected, lo que significa que se puede leer de los padres y el niño. El constructor de las clases establece la variable al valor deseado. De esta forma, solo implementará la función de impresión una vez y no necesitará un método duplicado reemplazado.

0

Cuando estaba tratando de descubrir la palabra clave extender, estaba usando dos clases. Espero que también te ayude a entender la idea básica.

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

}