2013-09-26 6 views
0

Я определил объект и объявил статическую переменную i. В методе get(), когда я пытаюсь напечатать переменную instance и class, оба печатают одно и то же значение.статическая переменная vs не статическая переменная

Не является ли this.i переменной экземпляра? Должен ли он печатать 0 вместо 50?

public class test { 
    static int i = 50; 
    void get(){ 
     System.out.println("Value of i = " + this.i); 
     System.out.println("Value of static i = " + test.i); 
    } 

    public static void main(String[] args){ 
     new test().get(); 
    } 

} 
+0

Переменная 'static' объявляется на уровне класса, а не в экземпляре. Он всегда будет одинаковым для каждого экземпляра. На него можно ссылаться как 'this.VARIABLE' или' Type.Variable'. –

+1

Как в стороне, даже для тестового кода лучше следовать правилам именования. Было бы более очевидно, что происходит, если ваш класс назывался 'Test', а не' test'. –

ответ

8

Нет, есть только одна переменная - вы не указали никаких переменных экземпляра.

К сожалению, Java позволяет получить доступ к статическим членам, как если бы вы обращались к нему с помощью ссылки соответствующего типа. Это дефект дизайна IMO, и некоторые IDE (например, Eclipse) позволяют вам отмечать его как предупреждение или ошибку, но это часть языка. Ваш код эффективно:

System.out.println("Value of i = " + test.i); 
System.out.println("Value of static i = " + test.i); 

Если вы сделать идти через выражение соответствующего типа, она даже и не проверить значение - например:

test ignored = null; 
System.out.println(ignored.i); // Still works! No exception 

Любые побочные эффекты все еще оценивается. Например:

// This will still call the constructor, even though the result is ignored. 
System.out.println(new test().i); 
+0

Технически вы не можете получить доступ к статическому элементу со ссылкой. Скорее, в javac есть немного «синтаксического уксуса», который позволит вам ссылаться на статику, используя DECLARED TYPE ссылочной переменной - значение/фактический класс переменной не имеет значения (и я не пробовал, но это может быть возможно, чтобы оно было нулевым). –

+0

@HotLicks: Да, значение не имеет значения - но это выражение, которое будет ссылкой. Это выражение такого типа. Будет редактировать, но я думаю, что это уже достаточно понятно. –

+0

Спасибо, что проверили, что это нуль! –

2

В поле i объявлен как static. Вы можете получить доступ к полям static либо с помощью YourClass.StaticField, либо instance.StaticField. Так оба

this.i 
test.i 

имеют в виду то же значение в контексте метода экземпляра вашего test класса.

Считается плохой практикой для доступа к полю static с this.i или instance.i.

0

static - это переменная уровня класса, а не статическая - переменная экземпляра (переменная уровня объекта). Таким образом, здесь вы объявляете только статическую переменную и называете ее по-разному, но с тем же значением.

this.i 
test.i 

как обрабатываемые как переменные класса, так и статическая переменная.

0

Вы не указали здесь какую-либо переменную экземпляра. Только одна статическая переменная. Если вы объявляете переменную экземпляра без присвоения значения, тогда, если вы попытаетесь напечатать это значение переменной экземпляра с помощью этого «ключевого слова», вы можете получить значение по умолчанию как 0.

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