2011-12-25 7 views
2

Я знаю, что в java статические методы могут использовать только статические переменные и статические методы, но нестатические методы могут использовать нестатические переменные и методы. есть ли какое-либо объяснение, почему статические методы могут обращаться к статическим переменным/методам? и не может получить доступ к нестационарным методам и переменным?Статические методы и переменные

+0

Возможный дубликат [Нельзя ссылаться на статическая функция?] (http://stackoverflow.com/questions/8029845/cannot-be-referenced-from-a-static-function) –

+0

Это не дубликат, содержание моего вопроса совершенно другое. – KyelJmD

+2

Ответы на этот вопрос одинаково хорошо подходят к этому вопросу. –

ответ

8

для доступа к нестационарным методам/полям требуется экземпляр класса.

+0

... по определению. –

+0

Но ОП хочет знать * почему *. Это какое-то произвольное правило, или есть причина? Нам надлежит объяснять «да, есть очень важная причина». ИМХО... – paulsm4

+1

Если понимать, что означает 'static' (а не просто изучать правила), то причина должна быть очевидной. –

2

Подумайте об этом:

а) Предположим, что вы статический метод.

b) Вы существуете независимо от любого экземпляра объекта. Вы существуете, даже если нет экземпляра класса NO.

c) Вы хотите получить доступ к нестатической переменной. Переменная, которая существует в ОДНОМ и ТОЛЬКО одном экземпляре объекта - переменная, которая ОПРЕДЕЛЕНА к ЭТОМУ ОПРЕДЕЛЕННОМУ экземпляру объекта.

d) Какую быстатическую переменную экземпляра объекта вы собираетесь использовать ???

Статические методы МОЖЕТ получить доступ к нестационарным членам классов ... при условии, что они делают это через ссылку на класс.

В противном случае - нет ссылки на класс - нет доступа.

Имеют смысл? ;)

+0

soo это означает, что это не ссылка класса, я не могу получить доступ к этой переменной экземпляра? я прав? – KyelJmD

+0

Точно правильно :) – paulsm4

3

Когда вы создаете экземпляр класса, он будет загружен в кучу или стек. В этом случае ваше приложение имеет ссылки на те части экземпляров памяти. Однако статические методы - это просто функции, загруженные в память. Вот почему, если ваш статический метод хочет получить доступ к переменной класса или методу, он не может просто вызвать его, потому что может быть несколько ссылок на этот класс в куче вопреки одному и только одному статическому методу.

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

0

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

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