2016-08-01 2 views
0

Я пытаюсь получить доступ к переменной дочернего класса с помощью метода родителя с помощью метода ключевого слова внутри. но его не печатает значение дочернего элемента, когда метод был вызван объектом ребенка. Вместо этого он печатает значение родительского класса, даже если этот метод был вызван дочерним объектом.«this» Ключевое слово не имеет доступа к Предполагаемая переменная, которую он должен. Зачем?

Вот мой код:

class C { 

    int t = 9; 
    void disp() { 
     // here 'this' shows to which object its referring. 
     // It showed me same as System.out.println(b) showed me 
     System.out.println(this); 
     /* 
     But, why this.t is printing 9, 
     when this method is called by 'b' reference variable, 
     it should print 0, because B class contains instance variable t 
     of its own and here this is pointing to the object of B class, 
     it shows 9 for 'c' and 1 for 'c1' but y not similarly 0 for 'b' 
     as when the method is called by 'b', 
     ***this refers to the memory location of b but doesn't prints the value of that object***, 
     hows that going on??? 
     */ 
     System.out.println(this.t); 
    } 
} 

class B extends C { 

    int t = 0; 
} 

class A { 

    public static void main(String args[]) { 
     C c = new C(); 
     C c1 = new C(); 
     B b = new B(); 
     c1.t = 1; 
     System.out.println("Memory location of c-->" + c); 
     c.disp(); // here output is 9 
     c1.disp(); //here output is 1 
     System.out.println("Memory location of b-->" + b); 
     b.disp(); 
    } 
} 

Выход:

c-->[email protected] 
[email protected] 
9 
[email protected] 
1 
b-->[email protected] 
[email protected] 
9 
+5

Вы не можете переопределить поля, только спрячьте их. То есть любой код родителя, который смотрит в поле, всегда будет обращаться к полю родителя, а не к дочернему полю. – RealSkeptic

+0

Подсказка: вы хотите, чтобы мы провели время, чтобы помочь вам. Поэтому вы делаете это как можно проще; начиная с использования функции «предварительного просмотра», чтобы гарантировать, что ваш исходный код будет отформатирован с соблюдением конфиденциальности. Кроме того; Я действительно не понимаю ваш вопрос. – GhostCat

ответ

1

Вы путаться между наиважнейшей концепцией методы с затенением переменного, так как динамическое связывание будет вызывать метод класса ребенка во время выполнения, но это неверно в случае «этой» ссылки на переменную, она не будет перезаписывать родительскую переменную, даже если у вас есть одна и та же переменная имени у ребенка.

+0

Правильный термин * скрывается * ([JLS §8.3] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.3)). * Shadowing * ([JLS §6.4.1] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-6.html#jls-6.4.1)] - это когда переменная в более тонкая область действия препятствует доступу к переменной во внешней области и не предполагает наследования. – RealSkeptic

+0

Я понимаю, что вы говорите здесь, но, возможно, это немного изменилось для читаемости. Я думаю, что комментарий от RealSkeptics намного легче понять. – Drgabble

+0

Спасибо, я позабочусь об этом. Бог благословил –