3

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

其中一个问题说:

int absoluteValue = abs(-21)

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

正确答案为:

import static java.lang.Math.abs;

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

4

3 回答 3

4

但我的问题是如果默认导入 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()等等。这很重要。(想象一下,如果你总是必须用全名来引用类......)

于 2015-02-11T13:07:54.180 回答
1

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

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

Mathabsolute()方法的内部实现。

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

abs()方法就是static方法,java.lang.*;不能导入类的静态成员。

于 2015-02-11T13:03:04.790 回答
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。这种技术(静态导入)适用于任何包下任何类的所有静态方法。

于 2015-02-13T21:00:27.323 回答