java.lang.Math.abs 默认不导入?

java.lang.Math.abs not imported by default?

我正在为初学者学习Java通过 Oracle 考试。

其中一个问题说给定:

int absoluteValue = abs(-21)

什么导入语句将编译所有代码?

给出的正确答案为:

import static java.lang.Math.abs;

但我的问题是,如果默认导入 java.lang.* 那么为什么 Math class 未导入并且 abs() 方法不可用?

你必须在 class 数学名称 class Math.abs() 上调用 abs() 方法,它是静态方法。

或者您必须导入 import static java.lang.Math.abs;

Mathclassabsolute()方法的内部实现。

public static long  abs(long a) {
    return (a < 0) ? -a : a;
 }

abs()方法是static方法,java.lang.*;不能导入class.

的静态成员

But my question is if java.lang.* is imported by default then why is the Math class not imported and the abs method not available?

因为不是。

因为那是 Java 的工作方式。在包 中隐式(或显式)通配符导入 classes 仅 导入 classes。它也不会静态导入 class 成员。

如果你想引用一个 class 的所有静态成员而不限定它们,你应该使用通配符静态导入;例如

import static java.lang.Math.*;

或者您可以静态导入单个成员;例如

import static java.lang.Math.abs;

他们为什么这样定义 Java?

嗯,最有可能的理由是隐式导入使代码更难阅读。如果像 abs 这样的方法是默认导入的,那么你需要知道它们都是什么......以及它们是从哪里导入的......才能理解代码的真正含义。

值得一提的是,静态导入只在Java5中加入。在此之前,没有Math资格是无法引用Math.abs的。


If you just import the class not its static members then what are you getting when you import it?

您刚刚获得 class 名称。例如:

import java.util.HashMap;

允许我写 new HashMap() 而不是 new java.util.HashMap() 等等。这很重要。 (想象一下,如果你总是不得不用他们的全名来指代 classes ....)

Java 不允许默认导入 static 方法。 java.lang.Math class 中的所有方法都是静态的。这就是为什么默认情况下不导入这些方法的原因,默认情况下会导入 java.lang.* 包中的所有 classes。

除了 import static java.lang.Math.abs; - 这个语句你可以使用下面两个 -

  • Math.abs() 直接(没有任何 import 语句)调用 abs() 方法。但这只适用于 java.lang 包中的静态方法,因为它们是默认导入的。
  • 或使用以下导入语句 -

import static java.lang.Math.*;

在这种情况下,您可以使用没有 class 名称的 abs() 方法 - Math。这种技术(静态导入)将适用于任何包下任何 class 的所有静态方法。