2

以下のクラスでは、次の行でコンパイル エラーが発生します println("Hello World!");: The method println(String) is undefined for the type StaticImport:

import static java.lang.Math.*;
import static java.lang.System.*;

public class StaticImport {
    public static void main(String[] args) {
        println("Hello World!");
        out.println("Considering a circle with a diameter of 5 cm, it has:");
        out.println("A circumference of " + (PI * 5) + " cm");
        out.println("And an area of " + (PI * pow(2.5,2)) + " sq. cm");
    }
}

メソッド名 'out' を使用する必要がある println メソッドとは異なり、 pow を明示的にインポートせずに java.lang.Math で pow メソッドにアクセスできるのはなぜですか?

4

3 に答える 3

6

静的インポートを使用すると、クラスを完全に修飾しなくても、クラスの直接のメンバーにアクセスできます。のメンバーであるため、静的インポートを使用すると、直接アクセスできますout。また、のメンバーであるため、直接アクセスSystemすることもできます。しかし、その方法はありません。します (のタイプ)。powMathMathSystemprintlnPrintWriterout

あなたの静的インポート...

import static java.lang.System.*;
//...
println("Hello World!");

... は、次のコードと同等であり、コンパイルされないことがわかります。

System.println("Hello World!");
于 2013-07-11T21:54:52.393 に答える
5

printlnクラスのoutメンバーに属するメソッドです。Systemその修飾子がなければ、Java は何printlnが何なのかわかりません。

静的インポートを行うと、完全修飾名を指定しなくてもクラスのメンバーにアクセスできます。したがって、の静的インポートにより、持っているjava.lang.SystemすべてのものにアクセスできますSystem。これは、に属するout(インスタンス) にアクセスできることを意味します。ただし、に属しているからといって、直接アクセスできるわけではありませ。そのため、最初に通過する方法を Java に伝える必要があります。PrintWriterSystemprintlnoutprintlnout

このように見てください。次の構造があるとします。

MyClass
   |
   +---Something
   |      |
   |      +---- methodOne
   |      |
   |      +---- methodTwo
   |      |
   |      +---- OtherThing
   |                |
   |                +---- otherMethodOne
   |                |
   |                +---- otherMethodTwo
   +---method

で静的インポートを行った場合MyClass.*:

  • アクセス権がありますmethod()(Java はこれを に変換しますMyClass.method())
  • にアクセスできますSomething。(Java はこれを に変換しますMyClass.Something)
  • の下にある他のものへの生のアクセス権はありませSomething。たとえば、methodOne()Java はそれを に変換し、 の下でMyClass.methodOne()呼び出されるメソッドがないため、単純に呼び出すことはできません。そのメソッドは に属しているので、 、またはを実行できます。methodOne()MyClassSomethingSomething.methodOne()Something.OtherThing.otherMethodOne()

で静的インポートを行った場合MyClass.Something.*:

  • にアクセスできますmethodOne。(Java はこれを に変換しますMyClass.Something.methodOne)
  • にアクセスできますmethodTwo。(Java はこれを に変換しますMyClass.Something.methodTwo)
  • にアクセスできますOtherThing。(Java はこれを に変換しますMyClass.Something.OtherThing)
  • orへの raw アクセス権がありませ。またはを行う必要があります。otherMethodOneotherMethodTwoOtherThing.otherMethodOne()OtherThing.otherMethodTwo()
  • へのアクセス権はありませmethod。Java はそれを に変換しますが、クラスMyClass.Something.methodにはそのようなメソッドがありません。Something
于 2013-07-11T21:54:57.237 に答える
0

pow は Math クラスの static メソッドなので、先頭に import java.lang.Math 文を書いておけば、Math クラスのオブジェクトを作成せずにアクセスできますが、out は PrintStream 型の System クラスと println( ) は PrintStream クラスのメソッドであり、静的ではないため、オブジェクトを作成しないと非静的関数を呼び出すことができないため、静的な方法でアクセスすることはできません。PrintStream の詳細については、このリンクを参照することもできます http://docs.oracle.com/javase/6/docs/api/java/io/PrintStream.html

于 2013-07-11T22:03:31.037 に答える