вызов нестатического метода в статическом методе в Java [duplicate]
этот вопрос уже есть ответ здесь:
Я получаю ошибку, когда пытаюсь вызвать нестатический метод в статическом классе.
не удается сделать статическую ссылку на нестатический метод methodName() из типа воспроизведение
Я не могу сделать метод статическим, так как это дает мне ошибку.
этот статический метод не может скрыть метод экземпляра от xInterface
есть ли способ обойти вызов нестатического метода в другой статический метод? (Эти два метода находятся в отдельных пакетах и отдельных классов).
14 ответов
единственный способ вызвать нестатический метод из статического метода - иметь экземпляр класса, содержащий нестатический метод. По определению, нестатический метод-это метод, который вызывается на экземпляре некоторого класса, тогда как статический метод принадлежит самому классу.
вы можете создать экземпляр класса, который вы хотите вызвать метод, например,
new Foo().nonStaticMethod();
сначала создайте экземпляр класса и вызовите нестатический метод, используя этот экземпляр. е.г,
class demo {
public static void main(String args[]) {
demo d = new demo();
d.add(10,20); // to call the non-static method
}
public void add(int x ,int y) {
int a = x;
int b = y;
int c = a + b;
System.out.println("addition" + c);
}
}
public class StaticMethod{
public static void main(String []args)throws Exception{
methodOne();
}
public int methodOne(){
System.out.println("we are in first methodOne");
return 1;
}
}
приведенный выше код не выполняется, потому что статический метод должен иметь ссылку на этот класс.
public class StaticMethod{
public static void main(String []args)throws Exception{
StaticMethod sm=new StaticMethod();
sm.methodOne();
}
public int methodOne(){
System.out.println("we are in first methodOne");
return 1;
}
}
это определенно будет выполнено. Потому что здесь мы создаем ссылку, которая ничего, кроме "sm", используя эту ссылку того класса, который ничего
но (StaticMethod=new Static method()
) мы вызываем метод one (sm.methodOne()
).
Я надеюсь, что это будет полезно.
Это звучит как метод действительно должны быть статическим (т. е. он не имеет доступа к каким-либо членам данных, и ему не нужен экземпляр для вызова). Поскольку вы использовали термин "статический класс", я понимаю, что весь класс, вероятно, посвящен утилитарным методам, которые могут быть статическими.
однако Java не позволяет реализации определяемого интерфейсом метода быть статическим. Поэтому, когда вы (естественно) пытаетесь сделать метод статическим, вы получаете "не-Хайде-экземпляр-метод" ошибка. (Спецификация языка Java упоминает об этом в 9.4: "обратите внимание, что метод, объявленный в интерфейсе, не должен быть объявлен статическим или возникает ошибка времени компиляции, поскольку статические методы не могут быть абстрактными.")
до тех пор, пока метод присутствует в xInterface
и ваш класс реализует xInterface
, вы не сможете сделать метод статическим.
Если вы не можете изменить интерфейс (или не хотите), есть несколько вещей, которые вы можете сделать:
- сделать класс одноэлементным: сделать конструктор закрытым и иметь статический член данных в классе для хранения единственного существующего экземпляра. Таким образом, вы будете вызов метода на экземпляре, но по крайней мере вы не будете создавать новые экземпляры каждый раз, когда вам нужно вызвать метод.
- реализуйте 2 метода в своем классе: метод экземпляра (как определено в
xInterface
), и статический метод. Метод instance будет состоят из одной строки, которая делегирует статический метод.
вам нужен экземпляр класса, содержащий нестатический метод.
похоже на то, когда вы пытаетесь вызвать нестатический метод startsWith
класса String
без примера:
String.startsWith("Hello");
вам нужно иметь экземпляр, а затем вызвать нестатический метод:
String greeting = new String("Hello World");
greeting.startsWith("Hello"); // returns true
поэтому вам нужно создать и экземпляр, чтобы вызвать его.
единственный способ вызвать нестатический метод из статического метода - иметь экземпляр класса, содержащий нестатический метод.
class A
{
void method()
{
}
}
class Demo
{
static void method2()
{
A a=new A();
a.method();
}
/*
void method3()
{
A a=new A();
a.method();
}
*/
public static void main(String args[])
{
A a=new A();
/*an instance of the class is created to access non-static method from a static method */
a.method();
method2();
/*method3();it will show error non-static method can not be accessed from a static method*/
}
}
есть два пути:
- вызовите нестатический метод из экземпляра внутри статического метода. См. ответ Фабиана для образца oneliner... хотя я бы настоятельно рекомендовал этого не делать. На своем примере он создает экземпляр класса и использует его только для одного метода, только чтобы позже избавиться от него. Я не рекомендую его, потому что он обрабатывает экземпляр как статическую функцию.
- измените статический метод на нестатический.
вы не можете обойти это ограничение напрямую, нет. Но в вашем конкретном случае могут быть некоторые разумные вещи, которые вы можете сделать.
например, вы можете просто "создать" экземпляр своего класса в статическом методе, а затем вызвать нестатический метод.
но вы можете получить еще лучшие предложения, если вы опубликуете свой класс (ы) -- или их уменьшенную версию.
самый простой способ использовать нестатический метод / поле в статическом методе или наоборот...
(для этого должен быть хотя бы один экземпляр этого класса)
этот тип ситуации очень распространен в разработке приложений для android, например:-действие имеет по крайней мере один экземпляр.
public class ParentClass{
private static ParentClass mParentInstance = null;
ParentClass(){
mParentInstance = ParentClass.this;
}
void instanceMethod1(){
}
static void staticMethod1(){
mParentInstance.instanceMethod1();
}
public static class InnerClass{
void innerClassMethod1(){
mParentInstance.staticMethod1();
mParentInstance.instanceMethod1();
}
}
}
Примечание: - это не может использоваться в качестве метода builder, как этот.....
String.valueOf(100);
Я использую интерфейс и создаю анонимный экземпляр этого типа:
AppEntryPoint.java
public interface AppEntryPoint
{
public void entryMethod();
}
Main.java
public class Main
{
public static AppEntryPoint entryPoint;
public static void main(String[] args)
{
entryPoint = new AppEntryPoint()
{
//You now have an environment to run your app from
@Override
public void entryMethod()
{
//Do something...
System.out.println("Hello World!");
}
}
entryPoint.entryMethod();
}
public static AppEntryPoint getApplicationEntryPoint()
{
return entryPoint;
}
}
не так элегантно, как создание экземпляра этого класса и вызов собственного метода, но выполняет то же самое, по существу. Просто еще один способ сделать это.
конструктор-это специальный метод, который теоретически является "единственным" нестатическим методом, вызываемым любым статическим методом. иначе ее не допустят.
невозможно вызвать нестатический метод в статическом методе. Логика заключается в том, что мы не создаем объект для создания экземпляра статического метода, но мы должны создать объект для создания экземпляра нестатического метода. Таким образом, нестатический метод не получит объект для его создания внутри статического метода, что делает его неспособным к созданию экземпляра.