2016-06-24 8 views
0

私はスカラーで長い時間を過ごした後でJava 8を見てきました。私がハッキングしていたときにスカラーモードになってしまったので、私は"# instance_method:%s thread:%d".format(testStr, testNum);"のようなものを書きました。奇妙なコンパイラは、たとえString型のドキュメントで "format"という名前のインスタンスメソッドを見つけられなくても、私は静的メソッドのドキュメントがここで何を意味するのか分かりませんでした。したがって、次のコード:文字列インスタンスの呼び出し形式

public class Weird{ 
    public static void main(String[] args){ 
     String testStr = "hmm"; 
     Long testNum = 7L; 
     String weird = "# instance_method:%s thread:%d".format(testStr, testNum); 
     String msg = String.format("# static:%s thread:%d", testStr, testNum); 
     System.err.println(weird); 
     System.err.println(msg); 
    } 
} 

は出力を与えた:

hmm 
# static:hmm thread:7 

ので"# instance_method:%s thread:%d".format(testStr, testNum);testStrに評価されます。私はおそらく何かダムをやっているが、ここで何が起こっているのだろうか?

+1

ええ、見つけにくい:https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#format-java.lang.String-java.lang.Object .. .-。インスタンスまたはクラス自体(最初のものはコード化されていないものの、コードの匂いですが)では静的メソッドを呼び出すかどうかは関係ありません。 – Tom

+0

インスタンスメソッドはどこですか? public static String format(String format、 Object ... args) – sgldiv

+0

@sgldivインスタンスメソッドはありません。しかしJavaでは、インスタンスに対して 'static'メソッドを呼び出すことができます。 – resueman

答えて

1

あなたは引数testNumtestStrをフォーマットし、次の式

"# instance_method:%s thread:%d".format(testStr, testNum); 

すなわち内staticformatメソッドを呼び出しています。 "hmm"にはプレースホルダがないため、これは単に"hmm"と評価されます。

インスタンスを使用してstaticメソッドを呼び出すことは、Javaでは有効ですが、混乱を招く可能性があるため避けてください。この場合に呼び出されるメソッドを決定するために、式の型が使用されます。

関連する問題