Но мой вопрос в том, что 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()
Etcetera. Это важно. (Представьте, что вам всегда приходилось относиться к классам по их полному имени ....)
'import java.lang. *;'! = 'Import static java.lang.Math. *;' – johnchen902
делает java.lang. * Не означает все классы в пакете lang? – user4702831