«Может ли нестатический метод получить доступ к статической переменной или вызвать статический метод» — это один из часто задаваемых вопросов о статическом модификаторе в Java. Ответ: да , нестатический метод может обращаться к статической переменной или вызывать статический. метод в Java. Нет проблем с этим из-за статических членов, то есть как статические переменные, так и статические методы принадлежат классу и могут вызываться из любого места, в зависимости от их модификатора доступа.
Например, если статическая переменная является закрытой, то к ней можно получить доступ только из самого класса, но вы можете получить доступ к общедоступной статической переменной из любого места. Точно так же закрытый статический метод может быть вызван из нестатического метода того же класса, но открытый статический метод, например, main (), может быть вызван из любого места.
Вот пример кода, чтобы доказать нашу точку зрения, что нестатический метод может обращаться как к статической переменной, так и к методу в Java:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
public class StaticTest { public static int iStatic = 10 ; public void nonStatic() { System.out.println( "can access static variable inside non-static method : " + iStatic); main( new String[ 2 ]); } public static void main(String[] args) { System.out.println( "Inside main method" ); } } |
Вы можете видеть, что этот код компилируется просто отлично, ошибки компиляции нет. Вы даже можете получить доступ к вложенному статическому классу из нестатического метода , это совершенно нормально.
Но просто подумайте: если ответ так прост, то почему этот вопрос часто задают на собеседованиях по Java и таких сертификациях Java, как OCAJP или OCPJP ? Ну, вопрос немного сложен и часто задает запутанных кандидатов, потому что обратное неверно, то есть вы можете получить доступ к статическим членам из нестатического контекста, но вы не можете получить доступ к нестатической переменной или методу из статического метода в Java.
Почему вы не можете получить доступ к нестатической переменной или вызвать нестатический метод из статического метода в Java? Да, это потому, что статический метод формирует статический контекст, в котором могут быть доступны только статические члены, но если вам нужно больше объяснений, я предлагаю вам пройти один из более полных ресурсов, таких как курс Базовые основы Java от Pluralsight Джима Уилсона.
Как я уже говорил, код — лучшая документация. Попробуйте доказать это, написав код, и вот что мы сделаем здесь. Ниже приведен пример кода, доказывающий вышеизложенное, что нестатические переменные или методы-члены не доступны из статического метода в Java:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
class Hello { private static int aStaticVariable = 1 ; private int aNonStaticVariable = 2 ; private static void aStaticMethod() { System.out.println(aNonStaticVariable); aNonStaticMethod(); } private void aNonStaticMethod() { System.out.println(aStaticVariable); } } |
$ javac Hello.java
01
02
03
04
05
06
07
08
09
10
11
12
13
|
Hello.java:11: non-static variable aNonStaticVariable cannot be referenced from a static context System.out.println(aNonStaticVariable); ^ Hello.java:12: non-static method aNonStaticMethod() cannot be referenced from a static context aNonStaticMethod(); ^ 2 errors |
Вы можете видеть, что, хотя вы можете получить доступ к статическим элементам из нестатического метода , обратное неверно. Если вы попытаетесь получить доступ к нестатической переменной или методу или даже к вложенному классу, компилятор выдаст ошибку «Нестатический метод XXXX не может быть указан из статического контекста» .
Итак, теперь возникает большой вопрос, как вы можете получить доступ к нестатической переменной или вызвать нестатический метод из статического метода, например, метода main () в Java? давай выясним.
Как получить доступ к нестатической переменной / методу из статического метода в Java
Что ж, есть законный способ доступа к любому нестатическому члену из статического контекста в Java путем создания экземпляров. Вы должны сначала создать объект класса, чей
нестатические члены или нестатический метод , к которому вы хотите получить доступ. Как только вы это сделаете, компилятор больше не будет вас беспокоить, как показано в следующем примере:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
public class Hello { private static int aStaticVariable = 1 ; private int aNonStaticVariable = 2 ; private static void aStaticMethod() { Hello object = new Hello(); System.out.println(object.aNonStaticVariable); object.aNonStaticMethod(); } private void aNonStaticMethod() { System.out.println(aStaticVariable); } } |
$ javac Hello.java
Вы можете видеть, что все ошибки времени компиляции исчезли после доступа к нестатической переменной и методу, используя объект класса Hello. Это правильный способ доступа к нестатическим переменным / методам из статического контекста, например, статического блока инициализатора, статического метода или вложенного статического класса в Java. Увидеть
Java: базовая платформа для более подробной информации.
Это все о том, может ли нестатический метод получить доступ к статической переменной или методу в Java или нет . Конечно, они могут, но обратное неверно, т.е. вы не можете получить доступ к нестатическому члену из статического контекста, то есть статического метода. Единственный способ получить доступ к нестатической переменной из статического метода — создать объект класса, которому принадлежит переменная.
Эта путаница является основной причиной, по которой вы видите этот вопрос на основных интервью по Java, а также на основных сертификатах Java, например, экзамен OCAJP и OCPJP. Вы найдете много вопросов, основанных на статических концепциях OCAJP, поэтому очень важно хорошо подготовить эту тему, прочитав хорошую базовую книгу по Java, например, учебное пособие OCAJP от Мала Гупты . Это отличная книга для изучения основ Java, даже если вы не готовитесь к экзаменам.
Дальнейшее обучение
Whizlabs Java 8 Exam Simulator
См. Оригинальную статью здесь: Может ли нестатический метод получить доступ к статической переменной / методу в Java?
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |