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

licensed under cc by-sa 3.0 with attribution.