Вызов нестатического метода в статическом методе в Java
Я получаю сообщение об ошибке при попытке вызвать нестатический метод в статическом классе.
Невозможно сделать статическую ссылку на нестатический метод methodName() из типа воспроизведения
Я не могу сделать метод статичным, так как это тоже дает мне ошибку.
Этот статический метод не может скрыть метод экземпляра от xInterface
Есть ли способ обойти вызов нестатического метода в другом статическом методе? (Эти два метода находятся в отдельных пакетах и отдельных классах).
14 ответов
Единственный способ вызвать нестатический метод из статического метода - это создать экземпляр класса, содержащий нестатический метод. По определению нестатический метод - это метод, который называется ON экземпляром некоторого класса, тогда как статический метод принадлежит самому классу.
Вы можете создать экземпляр класса, для которого вы хотите вызвать метод, например
new Foo().nonStaticMethod();
Сначала создайте класс Instance и вызовите нестатический метод, используя этот экземпляр. например,
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()
) мы вызываем метод один (sm.methodOne()
).
Я надеюсь, что это будет полезно.
Похоже, что метод действительно должен быть статическим (то есть он не имеет доступа к каким-либо элементам данных и не требует вызова экземпляра). Поскольку вы использовали термин "статический класс", я понимаю, что весь класс, вероятно, предназначен для утилитарных методов, которые могут быть статическими.
Однако Java не позволяет реализации метода, определенного интерфейсом, быть статичным. Поэтому, когда вы (естественно) пытаетесь сделать метод статичным, вы получаете ошибку "невозможное скрыть экземпляр". (Спецификация языка Java упоминает это в разделе 9.4: "Обратите внимание, что метод, объявленный в интерфейсе, не должен быть объявлен как статический, иначе возникнет ошибка времени компиляции, поскольку статические методы не могут быть абстрактными".)
Так что пока метод присутствует в xInterface
и ваш класс реализует xInterface
, вы не сможете сделать метод статичным.
Если вы не можете изменить интерфейс (или не хотите), вы можете сделать несколько вещей:
- Сделайте класс одноэлементным: сделайте конструктор закрытым и включите в класс статический член данных для хранения единственного существующего экземпляра. Таким образом, вы будете вызывать метод для экземпляра, но, по крайней мере, вы не будете создавать новые экземпляры каждый раз, когда вам нужно вызвать метод.
- Реализуйте в своем классе 2 метода: метод экземпляра (как определено в
xInterface
) и статический метод. Метод экземпляра будет состоять из одной строки, которая делегирует статический метод.
Вам нужен экземпляр класса, содержащий нестатический метод.
Это как при попытке вызвать нестатический метод 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*/
}
}
Я использую интерфейс и создаю анонимный экземпляр этого так:
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;
}
}
Не так элегантно, как создание экземпляра этого класса и вызов его собственного метода, но, по сути, выполняет то же самое. Просто еще один способ сделать это.
Вы не можете обойти это ограничение напрямую, нет. Но могут быть некоторые разумные вещи, которые вы можете сделать в вашем конкретном случае.
Например, вы можете просто "создать новый" экземпляр вашего класса в статическом методе, а затем вызвать нестатический метод.
Но вы можете получить даже лучшие предложения, если вы разместите свой класс (ы) - или их уменьшенную версию.
Есть два способа:
- Вызовите нестатический метод из экземпляра внутри статического метода. Смотрите ответ Фабьена для образца oneliner... хотя я настоятельно рекомендую против этого. В своем примере он создает экземпляр класса и использует его только для одного метода, только чтобы он позднее избавился от него. Я не рекомендую это, потому что это рассматривает экземпляр как статическую функцию.
- Измените статический метод на нестатический.
Невозможно вызвать нестатический метод внутри статического метода. Логика заключается в том, что мы не создаем объект для создания экземпляра статического метода, но мы должны создать объект для создания экземпляра нестатического метода. Таким образом, нестатический метод не получит объект для его реализации внутри статического метода, что сделает его неспособным к реализации.
Самый простой способ использовать нестатический метод / поле в статическом методе или наоборот...
(Для работы должен быть хотя бы один экземпляр этого класса)
Этот тип ситуации очень распространен в разработке приложений для Android, например:- у Activity есть хотя бы один экземпляр.
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();
}
}
}
Примечание:- Этот метод нельзя использовать как этот метод.....
String.valueOf(100);
Конструктор - это специальный метод, который в теории является "единственным" нестатическим методом, вызываемым любым статическим методом. иначе это не разрешено.
Вы можете вызвать нестатический метод внутри статического, используя:Classname.class.method()