В качестве новичка я задаюсь вопросом, почему мой 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);
}
}
В Java вы не можете иметь исполняемые операторы, которые не являются частью метода. * Первая строка в порядке:
VelocityCounter caller = new VelocityCounter();
потому что компилятор считает, что вы объявляете и инициализируете переменную экземпляра с именем caller
для класса Velocity2
. Однако вторая строка:
caller.VelocityC(6, 3);
является незаконным на верхнем уровне объявления класса.
*Технически, это не совсем правильно.Выражения могут также отображаться в конструкторах, static
блоках и блоках инициализации экземпляра.
Это потому, что код вне методов или конструкторов является только декларативным. Вы не можете ставить утверждения, подобные присваиванию или вызовам методов вне методов или конструкторов.
public class Test { int v = 5; { v += 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
Velocity2
. И он будет выполняться каждый раз, когда создается один, что может не соответствовать тому, что хочет OP.