ホームページ >Java >&#&チュートリアル >Java 関数のオーバーロード メカニズムで最も一致するメソッドを決定するにはどうすればよいですか?

Java 関数のオーバーロード メカニズムで最も一致するメソッドを決定するにはどうすればよいですか?

WBOY
WBOYオリジナル
2024-04-26 09:06:01503ブラウズ

Java 関数のオーバーロード一致ルールは次のとおりです。 完全一致: パラメータのタイプと数値が変数パラメータに正確に一致: 変数パラメータ メソッドは、任意の数またはタイプのパラメータに一致します パッケージ化タイプと元のタイプの変換: 基本タイプとパッケージ化タイプは相互に排他的になる可能性があります 変換のオートボックス化/unboxing: 基本型の値とラップされた型オブジェクトは自動的に派生クラス型に変換できます: 派生クラス オブジェクトは基本クラスの型パラメーターと一致できます

Java 函数重载机制中如何确定最匹配的方法?

Java マッチング関数オーバーロード メカニズムのルール

関数オーバーロードを使用すると、同じクラス内に同じ名前で異なるパラメーターの型を持つ複数のメソッドを作成できます。オーバーロードされたメソッドが呼び出されるとき、JVM は引数リストに基づいて呼び出すのに最適なメソッドを決定します。

最適一致の判定ルール

  1. 完全一致: メソッドのパラメータリストに異なるものが存在する場合call パラメータの型と数が正確に一致する場合、そのメソッドは最も一致するメソッドです。
class Example {
    public void method(int a) {
        // ...
    }

    public void method(int a, int b) {
        // ...
    }
}

method(1) を呼び出すと、method(int a) と一致します。

  1. 可変パラメータ (Varargs) に準拠: メソッドが可変パラメータとして宣言されている場合、そのメソッドは任意の数または型 (プリミティブ型とオブジェクトを含む) で使用できます。パラメータは一致します。可変個引数メソッドは最後のメソッドとして宣言する必要があります。
class Example {
    public void method(Object... args) {
        // ...
    }

    public void method(int a, int b) {
        // ...
    }
}

method(1) または method(1, 2, "Hello") の呼び出しは、method(Object... args と一致します) )

  1. ラップされた型とプリミティブ型の間の変換: 基本型のラップ型 (Integer など) と対応するプリミティブ型 (int など) ) は相互に変換できます。 raw 型パラメータに一致するメソッドが存在するが、ラップされた型パラメータを使用して呼び出された場合、またはその逆の場合でも、そのメソッドは一致していると見なされます。
class Example {
    public void method(int a) {
        // ...
    }

    public void method(Integer a) {
        // ...
    }
}

method(1) または method(new Integer(1)) の呼び出しは、これら 2 つのメソッドと一致します。

  1. オートボックス化とボックス化解除: 基本型の値がラッパー型パラメーターに渡されると、その値は自動的にラッパー型オブジェクトにボックス化されます。ラップされた型オブジェクトが基本型パラメーターに渡されると、自動的にボックス化されて基本型値になります。
class Example {
    public void method(int a) {
        // ...
    }

    public void method(Integer a) {
        // ...
    }
}

method(1) または method(Integer.valueOf(1)) の呼び出しは、これら 2 つのメソッドと一致します。

  1. 派生クラス型: 派生クラス オブジェクトを使用するパラメーターを呼び出す場合、パラメーターはその基本クラス型のパラメーターと一致することもあります。
class Animal {
    public void makeSound() {
        // ...
    }
}

class Dog extends Animal {
    public void makeSound() {
        // ...
    }
}

makeSound(new Dog()) の呼び出しは、makeSound(Animal a) メソッドとも一致します。

実際的なケース

次のメソッドを持つ Shape クラスがあるとします。

public class Shape {
    public void draw() {
        // ...
    }

    public void draw(int size) {
        // ...
    }

    public void draw(int size, boolean fill) {
        // ...
    }
}

## を呼び出すとき#Shapeshape = new Shape();shape.draw(5);、JVM は最も一致するメソッドが draw(int size) であると判断します。これは、呼び出しで size パラメータが指定されているが、fill パラメータが指定されていないため、draw(int size, boolean fill) は完全に一致しません。

以上がJava 関数のオーバーロード メカニズムで最も一致するメソッドを決定するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。