我正在通过 Oracle 学习 Java 初学者考试。
其中一个问题说:
int absoluteValue = abs(-21)
什么导入语句将编译所有代码?
正确答案为:
import static java.lang.Math.abs;
但我的问题是如果java.lang.*
默认导入,那么为什么Math
没有导入类并且abs()
方法不可用?
我正在通过 Oracle 学习 Java 初学者考试。
其中一个问题说:
int absoluteValue = abs(-21)
什么导入语句将编译所有代码?
正确答案为:
import static java.lang.Math.abs;
但我的问题是如果java.lang.*
默认导入,那么为什么Math
没有导入类并且abs()
方法不可用?
但我的问题是如果默认导入 java.lang.* 那么为什么没有导入 Math 类并且 abs 方法不可用?
因为它不是。
因为这就是 Java 的工作方式。包中类的隐式(或显式)通配符导入仅导入类。它也不做类成员的静态导入。
如果你想引用一个类的所有静态成员而不限定它们,你应该使用通配符静态导入;例如
import static java.lang.Math.*;
或者,您可以静态导入单个成员;例如
import static java.lang.Math.abs;
他们为什么这样定义Java?
嗯,最有可能的理由是隐式导入使代码更难阅读。如果abs
默认导入类似方法,那么您需要知道它们都是什么......以及它们从哪里导入......才能理解代码的真正含义。
值得一提的是,静态导入只是在 Java 5 中才加入的。在此之前,Math.abs
没有Math
限定是不能引用的。
如果您只是导入类而不是其静态成员,那么导入它时会得到什么?
你只是得到类名。例如:
import java.util.HashMap;
允许我写作new HashMap()
而不是new java.util.HashMap()
等等。这很重要。(想象一下,如果你总是必须用全名来引用类......)
你必须abs()
在数学类的类名上调用方法Math.abs()
,它是静态方法。
或者你必须导入import static java.lang.Math.abs;
Math
类absolute()
方法的内部实现。
public static long abs(long a) {
return (a < 0) ? -a : a;
}
abs()
方法就是static
方法,java.lang.*;
不能导入类的静态成员。
默认情况下, Java 不允许static
导入方法。类中的所有方法java.lang.Math
都是静态的。这就是为什么默认情况下不导入这些方法的原因,默认情况下java.lang.*
会导入包中的所有类。
除了import static java.lang.Math.abs;
- 此语句您可以使用以下两个中的任何一个 -
Math.abs()
直接(没有任何import
声明)调用该abs()
方法。但这仅适用于java.lang
包中的静态方法,因为它们是默认导入的。import static java.lang.Math.*;
在这种情况下,您可以使用abs()
没有类名的方法 - Math
。这种技术(静态导入)适用于任何包下任何类的所有静态方法。