Java: Почему я не могу вызвать этот метод вне main?

1

В качестве новичка я задаюсь вопросом, почему мой caller.VelocityC работает только при помещении внутри основного блока?

Когда у меня есть такой код, я не могу вызвать метод.

Класс вызова метода:

public class Velocity2 {

VelocityCounter caller = new VelocityCounter();
caller.VelocityC(6, 3);
}

Класс, содержащий метод:

public class VelocityCounter {  
void VelocityC(int s, int v){
    System.out.print(s/v);
  }
}
Теги:
object
methods
main

3 ответа

11
Лучший ответ

В Java вы не можете иметь исполняемые операторы, которые не являются частью метода. * Первая строка в порядке:

VelocityCounter caller = new VelocityCounter();

потому что компилятор считает, что вы объявляете и инициализируете переменную экземпляра с именем caller для класса Velocity2. Однако вторая строка:

caller.VelocityC(6, 3);

является незаконным на верхнем уровне объявления класса.

*Технически, это не совсем правильно.Выражения могут также отображаться в конструкторах, static блоках и блоках инициализации экземпляра.

  • 0
    +1 Для более наглядного и информативного ответа.
2

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

  • 1
    На самом деле вы можете: public class Test { int v = 5; { v += 2; } }
  • 1
    Конструкторы ...
Показать ещё 7 комментариев
2

В этой области исходного файла вы можете объявить поля класса или полей экземпляров, но если вы все еще действительно хотите вызвать caller.VelocityC(6, 3); то вы можете использовать блок инициализации экземпляра, например:

public class Velocity2 {

    VelocityCounter caller = new VelocityCounter();
    {
        caller.VelocityC(6, 3);
    }
}

caller.VelocityC(6, 3); будет выполняться во время каждой конструкции Velocity2, точно так же, как выполнение Constocity VelocityCounter и назначение вызывающему.

http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

  • 1
    Это будет выполняться, только если создан экземпляр Velocity2 . И он будет выполняться каждый раз, когда создается один, что может не соответствовать тому, что хочет OP.
  • 0
    Я предполагаю, что OP знает, что он выполняется каждый раз, так как он / она знал, что конструирование вызывающей стороны происходит также при каждой конструкции Velocity2, но я могу редактировать эту информацию в.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню