しかし、私の質問は、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;
etceteranew HashMap()
ではなく書くことができます。new java.util.HashMap()
これは重要です。(常にフルネームでクラスを参照しなければならない場合を想像してみてください....)