我正在通过Oracle学习初学者Java考试。
其中一个问题是:
int absoluteValue = abs(-21)
什么导入语句会编译所有代码?
正确答案如下:
import static java.lang.Math.abs;
但我的问题是,如果默认导入java.lang.*
,为什么Math
类未导入而abs()
方法不可用?
答案 0 :(得分:3)
但我的问题是,如果默认导入java.lang。*,那么为什么不导入Math类而abs方法不可用?
因为它不是。
因为这是Java的工作方式。包中的类的隐式(或显式)通配符导入仅导入类。它也不会对类成员进行静态导入。
如果要在不限定类的情况下引用类的所有静态成员,则应使用通配符静态导入; e.g。
import static java.lang.Math.*;
或者你可以静态导入个人成员; e.g。
import static java.lang.Math.abs;
为什么他们这样定义Java?
最有可能的理由是隐式导入会使代码更难阅读。如果默认导入abs
之类的方法,那么你需要知道它们是什么......以及它们从哪里导入......以便理解代码的真正含义。
值得了解的是静态导入仅在Java 5中添加。在此之前,如果没有Math.abs
资格,则无法引用Math
。
如果您只是导入该类而不是其静态成员,那么在导入它时会得到什么?
你只需要获得课程名称。例如:
import java.util.HashMap;
允许我编写new HashMap()
而不是new java.util.HashMap()
等。这很重要。 (想象一下,如果你总是不得不用他们的全名来引用课程......)
答案 1 :(得分:1)
你必须在数学类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.*;
无法导入类的静态成员。
答案 2 :(得分:0)
默认情况下,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
。这种技术(静态导入)适用于任何包下任何类的所有静态方法。