2015-02-11 3 views
3

Я изучаю для начинающих экзамен Java через Oracle.java.lang.Math.abs не импортируется по умолчанию?

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

int absoluteValue = abs(-21) 

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

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

import static java.lang.Math.abs; 

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

+2

'import java.lang. *;'! = 'Import static java.lang.Math. *;' – johnchen902

+0

делает java.lang. * Не означает все классы в пакете lang? – user4702831

ответ

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() Etcetera. Это важно. (Представьте, что вам всегда приходилось относиться к классам по их полному имени ....)

+0

Принимая мой вопрос немного дальше, если вы просто импортируете класс, а не его статические члены, то что вы получаете, когда импортируете его ?! Я имею в виду, что вы не получаете членов класса, из-за чего используется импорт этого класса, если вы не можете вызвать методы (или переменные?)? – user4702831

1

Вы должны позвонить 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.*; не может импортировать статический член класса.

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

Смежные вопросы