【问题标题】:java.lang.Math.abs not imported by default?java.lang.Math.abs 默认不导入?
【发布时间】:2015-02-11 12:58:38
【问题描述】:

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

其中一个问题说:

int absoluteValue = abs(-21)

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

正确答案为:

import static java.lang.Math.abs;

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

【问题讨论】:

  • import java.lang.*; != import static java.lang.Math.*;
  • java.lang.* 不是指lang包中的所有类吗?

标签: java import static-import


【解决方案1】:

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

因为不是。

因为这就是 Java 的工作方式。包中类的隐式(或显式)通配符导入 导入这些类。它也不做类成员的静态导入。

如果你想引用一个类的所有静态成员而不限定它们,你应该使用通配符静态导入;例如

import static java.lang.Math.*;

您也可以静态导入单个成员;例如

import static java.lang.Math.abs;

他们为什么这样定义 Java?

嗯,最有可能的理由是隐式导入使代码更难阅读。如果像abs这样的方法默认被导入,那么你需要知道它们都是什么......以及它们从哪里导入......才能理解代码的真正含义。

值得一提的是,静态导入仅在 Java 5 中添加。在此之前,如果没有 Math 限定符,则无法引用 Math.abs


如果你只是导入类而不是它的静态成员,那么导入它会得到什么?

您只需获取班级名称。例如:

import java.util.HashMap;

允许我写 new HashMap() 而不是 new java.util.HashMap() 等等。这很重要。 (想象一下,如果你总是必须用全名来引用类......)

【讨论】:

  • 让我的问题更进一步,如果你只是导入类而不是它的静态成员,那么导入它会得到什么?!我的意思是你没有得到类成员,所以如果你不能调用方法(或变量?),那么导入类有什么用?
【解决方案2】:

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

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

Mathabsolute() 方法的内部实现。

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2018-10-14
      • 1970-01-01
      • 2022-12-07
      • 1970-01-01
      • 2016-06-19
      • 2021-01-19
      • 1970-01-01
      • 2022-11-02
      • 2017-02-06
      相关资源
      最近更新 更多