Статический метод не может получить доступ к членам экземпляра класса

В 9-м издании Ляна Introduction to Java Programming говорится: «Статический метод не может получить доступ к членам экземпляра класса» (стр. 312). Я понимаю, почему экземпляру-члену класса нужен доступ к методу (который может быть статическим), но почему методу нужен доступ к экземпляру-члену? Для меня «доступ» означает «доступ посредством оператора точки». Другими словами:

 Class myClass = new Class();
 myClass.someStaticMethod();

имеет смысл, тогда как:

 someNonStaticMethod.myClass

or

 someStaticMethod.myClass

не. Разрешен ли синтаксис someNonStaticMethod.myClass? Я не верю, что когда-либо видел такое форматирование. Если это не разрешено, зачем упоминать, что статические методы не могут получить доступ к членам экземпляра класса?

Пожалуйста, помогите развеять мое замешательство.

-DI


person Digital Impermanence    schedule 02.12.2014    source источник
comment
Речь идет о коде внутри статического метода, например. public static void someStaticMethod() { someInstanceMethod(); } недействителен.   -  person Jon Skeet    schedule 02.12.2014
comment
@Digital: Кстати, предпочтительный способ доступа к статическому методу, используя ваш пример, Class.someStaticMethod(), а не через экземпляр класса (т.е. ваш myClass.someStaticMethod();)   -  person GriffeyDog    schedule 02.12.2014
comment
@Griffey Dog Возможен ли myClass.someStaticMethod()?   -  person Digital Impermanence    schedule 02.12.2014
comment
Да, возможно вызвать статический метод таким образом, но на самом деле это просто особенность синтаксиса Java, которая позволяет ему быть таким. Однако такой способ может сбивать с толку, поскольку он выглядит как вызов метода экземпляра, хотя это не так, и по этой причине его следует избегать.   -  person GriffeyDog    schedule 02.12.2014


Ответы (5)


Доступ к элементу экземпляра означает доступ к полю или атрибуту экземпляра, а не к самому экземпляру, поскольку он не будет компилироваться. Точка буквально не означает «доступ» именно так, как вы думаете, и я предполагаю, что это источник вашей путаницы. Точка используется для вызова метода для определенного объекта (см. эту ссылку) или для доступа к полю объекта (или класса, если поле является статическим).

Например, предположим, что класс определен следующим образом:

class MyClass {

   private int x;

   static void foo() {
      ... // foo cannot access member x
   }
}

Таким образом, в методе foo вы не можете ссылаться на x, потому что это поле-член MyClass, связанное с экземпляром MyClass.

Также см. Понятие членов класса, чтобы понять разницу между статическими членами и члены экземпляра.

person M A    schedule 02.12.2014

Вы не можете получить доступ к переменным экземпляра из статических методов.

public class Example {
    private Object instanceVariable;
    public static void staticMethod() {
        // Cannot use this in a static context
        this.instanceVariable = null;
    }
}

Вы можете получить доступ к переменным экземпляра из методов экземпляра.

public class Example {
    private Object instanceVariable;
    public void instanceMethod() {
        this.instanceVariable = null;
    }
}

Вы не должны обращаться к статическим переменным из методов экземпляра, используя this.

public class Example {
    private static Object staticVariable;
    public void instanceMethod() {
        // The static field Example.staticVariable should be accessed in a static way
        this.staticVariable = null;
    }
}

Вы всегда можете получить доступ к статическим переменным. Вы должны использовать имя класса.

public class Example {
    private static Object staticVariable;
    public void instanceMethod() {
        Example.staticVariable = null;
    }
}
person spongebob    schedule 02.12.2014

Статический метод не может ссылаться на нестатическое поле экземпляра класса.

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

person javaHunter    schedule 02.12.2014

Речь идет об этом:

public MyClass
{
   private String test;

   public static String getTest()
   {
       return this.test; //this is not possible because a static method cannot access an instance variable or method
   }

}

Причина, по которой статический метод не может получить доступ к переменной экземпляра, заключается в том, что статический метод ссылается на класс, а не на конкретный экземпляр класса, поэтому нет переменной экземпляра для доступа. Тест будет существовать только тогда, когда используется new MyClass, теперь будет существовать тест. Но если я вызову статический метод MyClass.getTest(), переменная экземпляра test не будет создана.

person brso05    schedule 02.12.2014

можно получить доступ к переменным экземпляра в статических методах, создав объекты

public class Test {
int x =10;

public static void main(String[]args)
{
    Test t1 = new Test();
    System.out.println(t1.x);
}

}

person Muli vinod    schedule 07.02.2017
comment
Вопрос был не в этом. Спрашивающий был сбит с толку методами доступа к экземплярам класса. - person Jan B.; 07.02.2017