【问题标题】:Is it possible to call a static method of another class from a non static method without instance in java?是否可以从没有java实例的非静态方法调用另一个类的静态方法?
【发布时间】:2016-07-14 04:37:25
【问题描述】:

静态方法尽可能接近全局方法。那么为什么这种类型的方法调用是不可能的呢?有没有其他方法可以在不实例化类的情况下调用静态方法??

import java.io.*;
import java.util.*;
class pgm
{
    int x,v;
    static void func()
    {
        System.out.println("Function run");
    }
}
class egs
{
    public static void main(String args[])
    {
        pgm p=null;
        pgm.func();
        try
        {
            p.x=10;
            p.func();
        }
        catch(NullPointerException e)
        {
            e.printStackTrace();
        }

    }
}

【问题讨论】:

  • func 不是静态方法。您正在尝试调用一个没有实例的非静态方法来调用它。
  • egs.func() 不存在...我不确定您为什么希望它起作用。静态方法不是全局的,它们仍然绑定到类。无论如何,你甚至没有静态方法(除了 main)
  • 你不需要任何对象实例来调用静态方法。你调用像ClassName.method()这样的静态方法
  • 您对代码进行了一些更正,现在问题出在p.x = 10;。 p 被分配为 null 并且随后未重新分配。因此,您会收到 NullPointerException。

标签: java static static-methods


【解决方案1】:

首先修饰符 static 不允许在类 pgm 中。

如果你想在类腿中调用 func 和 x。

你必须使用 public final 然后你的类名并将类的所有成员声明为静态。

然后你需要获得类 pgm 的参考。

所以你的代码将是

  import java.io.*;
  import java.util.*;
  public final class pgm
  {
     static int x,v;
     static void func()
     {
      System.out.println("Function run");
     }
   }

  class egs
  {
   public static void main(String args[])
   {
     pgm p=null;         //ref here 
      p.func();          // use ppm func here 
      try
      {
        p.x=10;
        p.func();
      }
      catch(NullPointerException e)
     {
        System.out.println("Null caught");
     }

  }
}

你会得到你想要的。

永远不要混淆静态用于在编译时编译整个块、方法、变量,这样您就可以在运行时调用任何静态的东西而无需任何实例化(使用 new)

上面我提供给你的正确方法。

【讨论】:

    【解决方案2】:

    我认为你很困惑。

    pgm.func();
    

    是调用静态方法的正确方式。而……

    p.func();
    

    即使p 为空(就像在您的代码中一样)仍然会被执行,因为编译器确实使用第一种方式,因为它知道该方法是静态的。

    旁注:您在 p.x 处捕获 NullPointerException,因此在此示例中不执行 func()

    所以回答,

    是否可以在没有实例的情况下从非静态方法调用另一个类的静态方法?

    是的,因为你从不需要实例来调用静态方法

    【讨论】:

    • 他得到 NullPointerException 的原因是 p.x = 10; - 因此它永远不会在 try 块中到达 p.func();
    • @ErwinBolwidt - 我很清楚,这不是重点。我说不抓就被处死
    • 当然这是重点。当 OP 运行他的代码时,他得到一个 NullPointerException。 p.func(); 不会像您声称的那样被执行,因为 p.x = 10; 导致了 NullPointerException。我同意 OP 不应该将该声明放在他的代码中,因为它与他的问题无关,但这很可能是 OP 混乱的根源之一。
    • @ErwinBolwidt - 我已经改写了我的答案
    【解决方案3】:

    您不能从非静态方法调用静态方法或变量,因为静态变量就像共享它们获取的一组相似的内存,然后可以作为首选使用。所以它与剩余的内存资源分开了。 Java一完成就释放其获取的资源,但静态成员持续到执行结束。

    【讨论】:

    • 我不知道你们在给出答案,因为这个问题在 SO 和谷歌上也有多个答案。
    • @MehradMalik - 这个问题与我假设您所指的问题并不重复。问题中的代码实际上可以编译
    猜你喜欢
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2013-04-01
    相关资源
    最近更新 更多