2017-05-08 5 views
0
public class ClassA { 

    int value = 50; 

    public void display(){ 

     System.out.println("ClassA displaying value:"+ value); 
    } 

} 

public class ClassB extends ClassA { 

    int value = 25; 

    public void display(){ 

     System.out.println("ClassB displaying value:"+ value); 
    } 

} 


public class Test { 

     public static void main(String[] args) { 

      ClassA objA = new ClassB(); 
      ClassB objB = new ClassB(); 

      System.out.println(objA.value); --> 50 
      System.out.println(objB.value); --> 25 

      objA.display(); --> ClassA Displaying value: 25 
      objB.display(); --> ClassB Displaying value: 25 
    } 

} 

Quelqu'un peut-il expliquer pourquoi objA est l'impression valeur superclasse 50.classe Super référence sur la variable membre et méthode

Dans primordial de la méthode, au moment de la compilation de la référence d'objet est ClassA et il recherche un affichage de méthode() en ClassA. Si cette méthode est disponible à ClassA, lors de l'exécution, l'objet réel créé est de classe B et la méthode display() dans ClassB remplace la méthode display() de ClassA.

Mais que se passe-t-il lorsque nous imprimons la propriété de classe "Value"?

ClassA objA = new ClassB(); 
System.out.println(objA.value); 

Ici, la référence est ClassA et l'objet réel est de ClassB. Donc, je m'attends à la valeur de classB: 25. Mais la valeur: 50 de ClassA est en train d'imprimer.

S'il vous plaît corriger si je comprends mal ..

Merci à l'avance

Répondre

0

D'abord, permettez-moi de corriger une petite erreur de libellé:

Dans primordial de la méthode, à Compile temps la La référence d'objet est ClassA et recherche une méthode Display() dans ClassA.

Non, les méthodes ne sont pas appelées au moment de la compilation. Ils sont appelés à l'exécution. Lors de l'exécution, l'objet est en fait un objet de ClassB, il recherchera la méthode ClassB, ce qui explique pourquoi le 2 display appelle impression bot 25.

Bon, maintenant vous devez comprendre la différence entre remplaçant et hiding. La méthode display est remplacée, donc même si objA est de type ClassA, la méthode en ClassB est appelée car objA contient en fait une instance de ClassB.

value, d'autre part, est caché. Lorsque vous accédez à value, objA est une variable de type ClassA, donc il recherche la valeur de value dans ClassA, même si objA contient un objet de ClassB.

Si vous souhaitez remplacer value, vous devez en faire une méthode:

class ClassA { 

    public int getValue() { return 50; } 

    public void display(){ 

     System.out.println("ClassA displaying value:"+ getValue()); 
    } 

} 

class ClassB extends ClassA { 

    public int getValue() { return 25; } 

    public void display(){ 

     System.out.println("ClassB displaying value:"+ getValue()); 
    } 

}