2017-06-28 1 views
1

Question: Le résultat du code suivant est "5 A" et "10 B". Comment est-il possible que pour b.print(), this.num est une référence à un objet de classe A et this.getClass() est une référence à un objet de classe B?Héritage Java - accès private variable/getClass()

Superclass A

public class A { 
    private int num; 

    public A(int num) { 
    this.num = num; 
    } 

    public void print() { 
    System.out.println(this.num + " " + this.getClass().getName()); 
    } 
} 

Sous-classe B

public class B extends A { 

    public B(int num) { 
    super(num); 
    } 
} 

Méthode principale

A a = new A(5); 
B b = new B(10); 
a.print(); 
b.print(); 
+0

'Mettre this.' en face d'un appel de méthode n'a pas d'effet. –

+1

Ce sont deux objets différents, qui obtiennent tous les deux le numéro qu'ils ont passé. Je ne vois pas pourquoi cela est déroutant. – byxor

Répondre

0

Ce sont deux distinct mince gs.

this.getClass() ou plus simplement getClass() (comme this est implicite comme non spécifié) sera toujours référence à la classe d'exécution réelle qui peut être la classe qui l'utilise ou d'un enfant de celui-ci. Si vous l'appelez depuis A, il retournera la classe A mais si vous l'appelez d'un enfant, il retournera cette classe enfant.

Alors que this.num fait référence à un champ d'instance spécifique déclaré dans la classe A.
Lorsque vous codez référence à ce champ, il dépend nécessairement de la classe qui déclare ce champ spécifique.

0

Chaque fois que vous appelez this dans une instance, vous allez appeler l'instance réelle, et non la "classe". Par exemple, dans votre cas, si vous remplacez la méthode print dans votre classe B, comme ceci;

public class B extends A { 

    public B(int num) { 
     super(num); 
    } 

    public void print() { 
     System.out.println("PRINTING B"); 
    } 
} 

Ensuite, lorsque vous appelez la méthode d'impression, il appellera celui-ci et non le parent d'un, même si vous utilisez this.print() dans toute méthode de la classe A

Si vous voulez vraiment imprimer explicitement la une classe, alors vous avez besoin de faire référence comme ceci:

public void print() { 
     System.out.println(this.num + " " + A.class.getName()); 
    }