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;
Math
classabsolute()
方法的内部实现。
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 的所有静态方法。
我正在为初学者学习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;
Math
classabsolute()
方法的内部实现。
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 的所有静态方法。