2013-06-09 5 views
1

Статические переменные и метод относятся к классу, а не к его экземплярам (объектам). обычно они доступны с использованием className.staticMethod() или className.staticVariable, но мы также можем получить доступ или вызвать их с использованием экземпляров класса, например. classInstance.staticMethod() и классInstance.staticVariable.Что происходит, когда мы вызываем статический метод/функцию с помощью экземпляра класса?

Мой первый вопрос является

Почему позволяют доступ статические методы/функции через экземпляры класса в 1-е место? Имеет ли он какой-либо прецедент?

Следующий вопрос заключается в follows.Consider следующий класс

public class Counter{ 
private static int count = 0; 

public static synchronized int getCount() 
{ 
    return count; 
} 

public synchronized setCount(int count) 
{ 
    this.count = count; 
} 

} 

В многопоточных среде, если эти функции называются ниже

Counter myCounter = new Counter(); 
myCounter.setCount(10); 
System.out.println(myCounter.getCount()); 

2 вопроса

Will обе функции имеют отдельный замок или тот же замок (учитывая, что оба они являются , вызываемые объект myCounter)? Если статический метод обработки потоков все еще приобретает блокировку уровня класса, как он внутренне выясняет, какую блокировку он должен принять?

+0

Они используют разные блокировки. Метод экземпляра имеет блокировку объекта экземпляра ('myCounter' lock), а статический метод имеет блокировку экземпляра класса (блокировка Counter.class). –

ответ

4

Question1: Экземпляр класса всегда имеет информацию о классе, так что это действительно вызвать статический метод из, например, как он будет иметь информацию о классе. Другой способ невозможен, так как у класса не будет информации о его экземплярах, поэтому вы не можете вызвать метод уровня экземпляра с использованием имени класса.

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

Вопрос2: Переходя к вопросу 2, момент, когда поток входит в статический блок или метод, который знает, JVM блокировки принимать т.е. уровень класса. Пользователь не контролирует его. Таким образом, метод экземпляра будет блокировать объект, а статический метод будет блокировать класс, поскольку поток работает на нем независимо от того, как выполняется вызов.

0

Q1: Вы можете камыш следующую ссылку

http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

Q2: Прежде всего, второй метод будет отображаться предупреждение, что он должен объявлен как статический, иначе поле не должно быть статическим. Как они вообще имеют разные замки; Метод экземпляра имеет блокировку объекта, а статический объект имеет блокировку уровня класса.

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