2015-01-19 1 views
0

Хотя мы используем этот/супер для вызова любых нестатических членов класса, JVM создает любой объект для соответствующего класса.«это» и «супер» использование ключевых слов в Java

И если я изменяю любую статическую переменную в суперклассе, используя «супер», это изменение также находит отражение в подклассе.

class A 
{ 
    int i; 
} 
class Test extends A { 
    void test() 
    { 
     super.i = 10; 
     this.i = 8; 
     System.out.println("super.i = " + super.i); 
     System.out.println("this.i = " + this.i); 
    } 
    public static void main(String[] args) { 
     Test obj = new Test(); 
     obj.test(); 
    } 
} 
+4

Что именно ваш вопрос? –

+2

Использование 'this' или' super' не вызывает создание каких-либо объектов. 'this' по сути присутствует во всех методах экземпляра, а' super' - это просто специальный тип вызова, который использует таблицу методов суперкласса, а не таблицу текущего класса. –

+1

Что касается ссылок на экземпляры экземпляров, если 'int i;' объявлен в обоих классах, тогда создаются два разных поля, и они ведут себя точно так, как если бы они были названы, скажем, 'j' и' k'. Однако, если у вас есть только 'i', объявленный в суперклассе, есть только один экземпляр, а' this.i' и 'super.i' ссылаются на то же самое поле. –

ответ

7

Я считаю, что ваш вопрос, почему два заявления

System.out.println("super.i = " + super.i); 
System.out.println("this.i = " + this.i); 

ли как печать то же самое (в частности, 8).

Причина в том, что this.i и super.i оба ссылаются на то же поле i. i, что Test имеет тот, который он унаследовал от A. Поэтому высказывание super.i является излишним.

Contrast ваш пример с этим:

public class A{ 
    int i; 
} 

public class B extends A{ 
    int i; 

    void test(){ 
     this.i = 8; 
     super.i = 10; 
     System.out.println("super.i = " + super.i); 
     System.out.println("this.i = " + this.i); 
    } 
} 

Здесь мы имеем два различных поля с именем i, так что просто i или this.i будет ссылаться на поле, объявленное в B, в то время как super.i будет относиться к i заявленной в A, что экземпляры B также унаследовали.

(в сторону: Это действительно страшная практика, называемая переменная затенение Старайтесь не делать это каждый раз, когда это возможно.)

+1

Хороший ответ. Простейшим правилом «не делать это, когда это возможно» является регулярное использование атрибутов нефинансовых классов «private», что в любом случае является хорошей идеей. – 5gon12eder

Смежные вопросы