静态方法调用

时间:2010-04-13 12:32:41

标签: java syntax static

我们可以在不提及Java中的类名的情况下调用静态方法吗?

5 个答案:

答案 0 :(得分:34)

是的,你可以。查看static imports。您必须在import语句中提及类名,但之后您不必以。{。来自链接的文章:

import static java.lang.Math.abs;
import static java.lang.Math.max;

int xDist = abs(destination.getX() - x);
int yDist = abs(destination.getY() - y);
return max(xDist, yDist);

在Java 5中引入。

答案 1 :(得分:20)

是的,您可以在不提及班级名称的情况下调用static方法。有import static(参见JLS 7.5.4确切的机制),但即使没有它,如果名称可以解析(请参阅JLS 15.12.1了解确切的机制)而没有完全限定类,它将起作用

以下代码按预期编译并打印"Hello world!"

import static java.lang.System.out;

public class Test {
   static String greeting() {
      return "Hello world!";
   }
   public static void main(String[] args) {
      out.println(greeting());
   }
}
out语句中的

println实际上是java.lang.System类的static字段访问权限,而不是static方法,但它是{{1}尽管如此,成员访问。 static是一个greeting()方法调用,可以省略类名,因为可以在不完全限定名称的情况下解析其引用。


现在让我们问一下这是不是一个好主意。除非你在课堂上调用static方法,否则一般都不要忽略课程名称!!!

让我们首先关注static。来自guide

的引用
  

那么什么时候应该使用静态导入? 非常谨慎!只有在您想要声明常量的本地副本或滥用继承(Constant Interface Antipattern)时才使用它。换句话说,当您需要频繁访问来自一个或两个类的静态成员时,请使用它。 如果过度使用静态导入功能,可能会使您的程序无法读取且无法维护,并使用您导入的所有static import成员污染其名称空间。您的代码的读者(包括您,在您编写它几个月后)将不知道静态成员来自哪个类。从类中导入所有静态成员对可读性特别有害;如果您只需要一个或两个成员,请单独导入它们。通过删除重复类名的样板,静态导入可以使您的程序更多可读。

通过以下示例使案例变得更加强大:

static

多么惊喜!您认为,由于class Base { void task1() { System.out.println("Base.task1"); } static void task2() { System.out.println("Base.task2"); } } class Child extends Base { void task1() { System.out.println("Child.task1"); } static void task2() { System.out.println("Child.task2"); } } //.... Base sweetChildOMine = new Child(); sweetChildOMine.task1(); // prints "Child.task1" sweetChildOMine.task2(); // prints "Base.task2" 引用了sweetChildOMine的实例,Child应该打印sweetChildOMine.task2(),因为它被"Child.task2"类覆盖,对吗? / p>

错误!无法覆盖Child方法!它只能被子类隐藏!实际上,如果您尝试做正确的事情并将static注释添加到@Override,则无法编译!

来自JLS 15.12.4.4 Locate method to invoke

  

如果调用模式为task2,则不需要目标引用,也不允许覆盖。类 T 的方法 m 是要调用的方法。

事实上,Java Puzzlers谜题48:我得到的只是静态的问题。在谜题结尾处给出的结论是:

  

总之,使用类名限定static方法调用,或者如果您从他们自己的类中调用它们,则根本不对它们进行限定,但从不使用表达式限定它们。另外,避免隐藏静态方法。总之,这些指南有助于消除静态方法动态调度的覆盖误导性外观。

最好一起遵循所有这些建议,所以:

  • 如果您在自己的课程中调用static方法,请不要限定
  • 否则,符合班级名称
    • 如果您在一个课程中这么做很多,请考虑该特定方法的static
      • 尽量不要static import所有成员static import
    • 绝不符合表达式
  • 不要隐藏*方法;你不能static它,它只会造成混乱

另见:

答案 2 :(得分:0)

是的,添加到Brian Agnew,您也可以通过该类类型的实例调用静态方法。

答案 3 :(得分:0)

是。

class CallStaticMethodTest { 
   public static void staticMethodOne() {
       System.out.println("Static method one");
   }

   // Invoke from a non-static method
   public void instanceMethodOne() {
        staticMethodOne();// Calling static method without mentioning the class name 
   }

   // Invoke from another static method:
   public static void staticMethodTwo() {
       staticMethodOne();
  }
}  

答案 4 :(得分:-1)

是的,您可以在没有类名的情况下调用静态方法。例如,如果您在同一个类的另一个静态方法中调用它。

公共类TestStatic {

static void hello()
{
   System.out.println("Hello World");
}
static void hello2()
{
   hello();
   System.out.println("Welcome to java");
}
public static void main(String[] args)
{
   hello2();
}

}