Статические методы не могут напрямую вызывать нестатические методы - PullRequest
0 голосов
/ 27 июня 2018

В соответствии с ограничениями, записанными в javatpoint , статические методы не могут напрямую вызывать нестатические методы. Что именно подразумевается под «напрямую» и почему я не могу это сделать? И да, каковы косвенные способы, которыми я могу это сделать?

Ответы [ 4 ]

0 голосов
/ 27 июня 2018

Статические методы привязаны к классу. Нестатические методы привязаны к экземпляру класса (объекта).

Это означает, что вы можете вызывать статические методы (напрямую) следующим образом:

SomeClass.someStaticMethod();

Но чтобы вызывать нестатические методы, сначала нужно создать объект класса (это то, что вы подразумеваете под «косвенно»):

SomeClass obj = new SomeClass();
obj.someNonStaticMethod();
<Ч />

Итак, если вы используете статический метод, вы находитесь вне объекта-экземпляра. Это означает, что вы не можете вызывать нестатический метод. Java волшебным образом не знает, с каким объектом вы хотели бы работать / выполнять метод.

public static void someStaticMethod()
{
    //You aren't working with any object here
}

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

public void someNonStaticMethod()
{
    //This is valid now.
    this.someOtherNonStaticMethod(); //"this." is optional
}

public void someOtherNonStaticMethod()
{
    //Do some stuff
}
<Ч />

Каковы косвенные способы, которыми я могу это сделать?

«Непрямой» способ вызова нестатического метода из статического состоит в том, чтобы сначала создать объект класса с помощью нестатического метода (как показано во втором кодовом блоке).

0 голосов
/ 27 июня 2018

«Непосредственно» здесь означает, что вы не вызываете метод объекта.

Например,

public class Foo {

   public static void method1() {
       Foo myFoo = new Foo();
       myFoo.method2();   // This is OK - we're calling method2 on an object.

       method2();         // This doesn't compile - we're trying to call method2 directly.

   }

   public void method2() {
       System.out.println("This is method2");
   }
}

Так что статический метод может вызывать нестатический метод, когда есть объект, для которого вызывается нестатический метод. Но прямой вызов без ссылки на объект невозможен.

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

0 голосов
/ 27 июня 2018

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

Конечно, они могут. Им просто нужен экземпляр для вызова. Вот пример статического метода, напрямую вызывающего нестатический метод:

class Example {
    public static void main(String[] args) {
        Example e = new Example();
        e.hiThere();     // <========== Direct call to instance method
        go(e);
    }
    private static void go(Example e) {
        e.hiThere();     // <========== Direct call to instance method
    }
    private void hiThere() {
        System.out.println("Hi there");
    }
}

Что именно подразумевается под «напрямую» и почему я не могу этого сделать?

Они, вероятно, означают "не использовать экземпляр". Это не то, как я бы определил «напрямую» вообще. Например, в приведенном выше примере main не может вызвать hiThere, не имея экземпляра для его вызова. Но как только у него есть экземпляр (в случае main, создав его), он может напрямую вызвать hiThere. Также в этом примере go может напрямую вызывать hiThere; он получает экземпляр в качестве параметра.

И да, каковы косвенные способы, которыми я могу это сделать?

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

0 голосов
/ 27 июня 2018

Это означает, что если у вас есть экземпляр метода a, вы не можете вызвать его из статического метода b, поэтому

void a() {
   // ...
}

static void b() {
    a();
}

недействительно.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...