2017-03-26 12 views
3

私が知ったように、Javaメソッドのオーバーロードでは、すべてのオーバーロードされたメソッドに同じ名前が使用されます。また、その戻り値の型は問題ではありません。しかし、以下の例のように、スタティックフォームと非スタティックフォームと同じメソッドを使用するとどうなりますか?このメソッドのオーバーロードを検討できますか?静的メソッドと非静的メソッドの両方でオーバーロードされるメソッド

class Adder { 

    static int add(int a, int b) { 
     return a + b; 
    } 

    int add(int a, int b, int c) { 
     return a + b + c; 
    } 

} 

class Test { 

    public static void main(String[] args) { 
     Adder a1 = new Adder(); 

     System.out.println(Adder.add(11, 11)); 

     System.out.println(a1.add(11, 11, 51)); 

    } 
} 

私はいくつかの記事を読んで、彼らは私の質問を明確にしませんでした。

+0

このコードを自分でテストしましたか? 2つのメソッドは同じシグネチャを持っていないので、JVMがどのメソッドを呼び出すかを知る能力に関して静的である必要はありません。 –

+0

このスレッドを読むこのスレッドを読むhttp://stackoverflow.com/questions/2475259/can-i-override-and-overload-static-methods-in-java –

+0

はい、私はすでにこのコードを実行しており、エラーなく実行されます。私が望むのは、この背後にある概念を知ることです。リンクありがとうございました:) – Kash

答えて

1

キーワードstaticを使用しても、メソッドのオーバーロードに違いはありません。

add()メソッドのメソッドシグネチャが異なるため、コードがコンパイルされます(2パラメータ対3パラメータ)。

しかし、もしあなたがこのようなものを書くならば、は、コンパイルエラーになります。

class Adder { 
    static int add(int a, int b) { 
     return a + b; 
    } 

    int add(int a, int b) { 
     return a + b + c; 
    } 
} 
+0

ラマンありがとう:) – Kash

0

インスタンスメソッドを静的メソッドでオーバーロードすることはできません(またはその逆)。これは多型のインスタンスです。異なる型シグネチャ(2 int(s)対3 ints())があるためです。あなたはJavaは

static int add(int... a) { 
    return IntStream.of(a).sum(); 
} 

よう8+とIntStream

static int add(int... a) { 
    int t = 0; 
    for (int v : a) { 
     t += v; 
    } 
    return t; 
} 

などがなく、以前のバージョンでは可変引数関数の利点は、任意の数を取ることができるということです使用して、可変引数の関数としてそれを書くことができます int(s)。

+0

ありがとうございます。私はそれを持っています:) – Kash

関連する問題