我们可以在不提及Java中的类名的情况下调用静态方法吗?
答案 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();
}
}