2011-12-21 12 views
9
public class JavaPuzzler { 

    public static void main(String[] args) { 
    JavaPuzzler javaPuzzler = null; 
    System.out.println(javaPuzzler.get()); 
    } 

    private static String get(){ 
     return "i am a java puzzler"; 
    } 
} 

あなたはmainメソッドがをnullに を初期化され、そしてあなたがnullのメソッドを呼び出すことはできませんローカル変数に()メソッドを取得する呼び出しますので、それはNullPointerExceptionがスローすべきであると思うかもしれません。nullオブジェクトのメソッドをどのように呼び出すことができますか?

このプログラムを実行すると、「私はJavaパズルラーです」というメッセージが表示されます。

誰でも私に答えを与えることができます。 ありがとうございます。

+2

大文字のJ – Nik

+0

のJavaPuzzler.get()は@Nikunjの質問は絶対に間違いありません。 – Nik88

+0

私のansをチェックしてください! – Nik

答えて

6

コードサンプルでget()は、インスタンスにではなく、クラスに属する静的メンバーです。メソッドを呼び出すためにインスタンスは必要ありません。

public static String get() // belongs globally to class, no instance required 
public String get() // belongs to instance 
+0

これは(たとえ 'null'でも)インスタンス変数で静的メソッドを呼び出すのが間違っているようです。しかし、興味深い。 –

+1

@Andrew Marshall:eclipseでコードを試してみると、自動的にinstance.call()からClass.call()に変更されます。 – Nik

1

あなたのメソッドは静的です。だから静的な方法で呼び出すことしかできませんでした。

javaPuzzler.get()として配置しても、実際の呼び出しはJavaPuzzler.get()となり、印刷されます。

3

getのメソッドは静的です。つまり、その呼び出しでjavaPuzzlerの実際の参照は無視され、変数の型だけが使用されます。

1

あなたは静的メソッドを呼び出していますが、それを呼び出すインスタンスは必要ありません。なぜそれが動作するのでしょうか。

1

NULLオブジェクトを使用してメソッドを呼び出すと、メソッドが静的でない限り、NullPointerExceptionがスローされます。

メソッドが静的であれば、それは実行されます。

読むHERE複数の基準

4

ための方法は静的であり、あなたがインスタンスを参照ものの、インスタンスが必要ではないからです。 Java言語仕様では、なぜsection 8.4.3.2

が宣言されているメソッドをクラスメソッドと呼びます。クラス メソッドは、特定のオブジェクトへの参照なしに常に呼び出されます。

これは、javaPuzzlerインスタンスがヌルであるかどうかに関係なく、メソッドがインスタンスではなくクラスに属していることを意味します。

1

get()は静的メソッドであるため、ここでは誰もが言及しています。

Javaでクラスを定義するとき、基本的にはオブジェクトが保持するデータと、そのデータを操作するメソッドのセットを定義することです。今では何千ものオブジェクトを持つことができますが、各オブジェクトのすべてのメソッドのコピーを持つことは理にかなっていません。どのようなことが起こるかは、クラスが定義したメソッドを格納し、そのメソッドを呼び出すオブジェクトのスコープで実行することです。初期化されていないオブジェクトでこれらのメソッドを呼び出そうとすると、そのオブジェクトはまだ存在していますが、そのメソッドはまだ存在しますが、有効なスコープはないため、NullPointerExceptionとなります。

このルールの例外は、スコープを必要としないメソッドであり、オブジェクト固有のデータを参照しないスタティックメソッドです。このため、オブジェクトが初期化されているかどうかに関係なく実行できます。

オブジェクトにはメソッドのコピーがないことを覚えておいてください。メソッドはオブジェクトのデータのスコープで呼び出されたばかりです。だから、まだ初期化されていないヌルオブジェクトのメソッドにアクセスすることはできますが、非静的メソッドは処理するデータがありません。

0

コンパイラはインスタンスコールをクラス呼び出しに自動的に変更します。あなたはstaticとしてのget()関数を与えている上記のコードで

... 
public static main([Ljava/lang/String;)V 
    L0 
    LINENUMBER 8 L0 
    ACONST_NULL 
    ASTORE 1 
    L1 
    LINENUMBER 9 L1 
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream; 
    INVOKESTATIC JavaPuzzler.get()Ljava/lang/String; 
    INVOKEVIRTUAL java/io/PrintStream.println(Ljava/lang/String;)V 
    L2 
    LINENUMBER 11 L2 
    RETURN 
    L3 
    LOCALVARIABLE args [Ljava/lang/String; L0 L3 0 
    LOCALVARIABLE javaPuzzler LJavaPuzzler; L1 L3 1 
    MAXSTACK = 2 
    MAXLOCALS = 2 
... 
0

:あなたは逆コンパイラを持っている場合は、生成されたバイトコードの変化を観察することができます。静的関数とデータメンバーは、どのオブジェクトにも属しません。彼らはクラスに属しています。あなたはクラスのオブジェクトを使用して静的関数を呼び出すことができますが、それは余分なメモリを消費するので、良いアプローチではありません。

静的なため、JavaPuzzler.get());あなたに出力を提供し、ヌルポインタ例外ではありません。

get()メソッドが静的でなかった場合、nullポインタ例外が発生します。

関連する問題