java.lang.Math.abs не импортируется по умолчанию?

Я учусь для начинающих экзамен по Java через Oracle.

Один из вопросов гласит:

int absoluteValue = abs(-21)

Какой оператор импорта скомпилирует весь код?

Правильный ответ дан как:

import static java.lang.Math.abs;

Но мой вопрос, если java.lang.* импортируется по умолчанию, то почему Math класс не импортируется и abs() метод недоступен?

3 ответа

Решение

Но мой вопрос: если 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, Этот метод (статический импорт) будет работать для всех статических методов любого класса в любом пакете.

Другие вопросы по тегам