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

时间:2015-02-11 12:58:39

标签: java import static-import

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

其中一个问题是:

int absoluteValue = abs(-21)

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

正确答案如下:

import static java.lang.Math.abs;

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

3 个答案:

答案 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;

Mathabsolute()方法的内部实施。

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。这种技术(静态导入)适用于任何包下任何类的所有静态方法。