Статические методы и переменные - PullRequest
2 голосов
/ 25 декабря 2011

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

Ответы [ 4 ]

8 голосов
/ 25 декабря 2011

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

3 голосов
/ 25 декабря 2011

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

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

2 голосов
/ 25 декабря 2011

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

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

б) Вы существуете независимо от экземпляра объекта.Вы существуете, даже если НЕТ экземпляра класса.

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

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

Статические методы МОГУТ обращаться к нестатическим членам классов ... при условии, что они делают это через ссылку на класс.

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

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

0 голосов
/ 25 декабря 2011

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

...