Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 静态方法调用_Java_Syntax_Static - Fatal编程技术网

Java 静态方法调用

Java 静态方法调用,java,syntax,static,Java,Syntax,Static,我们可以在Java中调用静态方法而不提及类名吗?可以。退房您必须在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中

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

可以。退房您必须在
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中引入。

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

是的,您可以调用
静态方法,而不必提及类名。还有导入静态的
(请参阅了解确切的机制),但即使没有它,如果在不完全限定类的情况下可以解析名称(请参阅了解确切的机制),它也会工作

以下代码按预期编译和打印“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());
   }
}
println
语句中的
out
实际上是类的
静态
字段访问,不是
静态
方法,但它是
静态
成员访问
greeting()
是一个
静态方法调用,可以省略类名,因为它的引用可以在不完全限定名称的情况下解析


现在让我们问问这是不是个好主意。除非您是从类中调用
静态
方法,否则通常省略类名不是一个好主意

让我们首先关注
静态导入
。引自:

那么什么时候应该使用静态导入呢非常节省仅当您试图声明常量的本地副本或滥用继承(常量接口反模式)时才使用它。换句话说,当您需要频繁访问一个或两个类的静态成员时,可以使用它如果过度使用静态导入功能,可能会使程序无法读取和维护,从而使导入的所有
静态
成员污染其命名空间。代码的读者(包括编写代码几个月后的您)将不知道静态成员来自哪个类。从类中导入所有静态成员对可读性尤其有害;如果只需要一个或两个成员,请分别导入它们。如果使用得当,静态导入可以通过删除重复类名的样板文件使程序更具可读性

通过以下示例,案例变得更加有力:

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"
真是个惊喜!您可能会认为,既然
sweedchildomine
引用了
Child
的一个实例,
sweedchildomine.task2()
应该打印
“Child.task2”
,因为它被
Child
类覆盖,对吗

错了!无法覆盖
静态
方法!它只能被一个子类隐藏!事实上,如果您尝试做正确的事情,并将
@Override
注释添加到
task2
,它将无法编译

发件人:

如果调用模式是静态的,则不需要目标引用,也不允许重写。类T的方法m是要调用的方法

事实上,这一问题在谜题48中有所涉及:我得到的只是静态的。谜题结束时得出的结论是:

总之,使用类名限定
静态
方法调用,或者如果从它们自己的类中调用它们,则根本不限定它们,但决不使用表达式限定它们。另外,避免隐藏静态方法。总之,这些指导原则有助于消除静态方法的动态分派重写的误导性外观

最好同时遵循所有这些建议,因此:

  • 如果在自己的类中调用
    静态
    方法,则不符合条件
  • 否则,请使用类名进行限定
      如果您在一个类中做了很多,请考虑该特定方法的<代码>静态导入< /代码>。
      • 尽量不要使用
        *
    • 永远不要用表达式来限定
  • 不要隐藏
    静态
    方法;你不能覆盖它,它只会引起混乱

另见:

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

公共类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();
}
}是的

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();
  }
}  

人力资源管理
…不提类名
我不同意这不是一个好主意。某些类型的命令实际上应该是静态的。使用这些命令时,如果希望允许不同的实现,那么传入实现该方法的类的实例是唯一合理的方法。当然,如果Java能够传入一个类类型并(轻松地)调用它的一个静态方法,那会方便得多。我同意这不是一个好主意,但我只是想说这也是可能的。你想进一步解释一下你的意思吗?我能马上想到至少三种完全不同的解释。。。