Maison  >  Article  >  Java  >  Comment déterminer la méthode la plus adaptée dans le mécanisme de surcharge des fonctions Java ?

Comment déterminer la méthode la plus adaptée dans le mécanisme de surcharge des fonctions Java ?

WBOY
WBOYoriginal
2024-04-26 09:06:01472parcourir

Les règles de correspondance de surcharge de fonctions Java sont : Correspondance exacte : le type et le numéro du paramètre correspondent exactement. Paramètres variables : la méthode des paramètres variables correspond à n'importe quel nombre ou type de paramètres. Conversion du type d'emballage et du type d'origine : les types de base et les types d'emballage peuvent être automatiquement convertis les uns aux autres. /unboxing : les valeurs de type de base et les objets de type encapsulés peuvent être automatiquement convertis en types de classe dérivés : les objets de classe dérivés peuvent correspondre aux paramètres de type de classe de base

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

Règles de correspondance du mécanisme de surcharge de fonctions Java

Surcharge de fonctions autorisée Créer plusieurs méthodes dans la même classe avec le même nom mais des types de paramètres différents. Lorsqu'une méthode surchargée est appelée, la JVM détermine la meilleure méthode correspondante à appeler en fonction de la liste d'arguments.

Détermination des règles pour la meilleure correspondance

  1. Correspondance exacte : Si la liste des paramètres d'une méthode correspond exactement au type et au nombre de paramètres d'appel, la méthode est la meilleure méthode de correspondance.
class Example {
    public void method(int a) {
        // ...
    }

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

L'appel de method(1) correspondra à method(int a). 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)可以相互转换。如果有一个方法匹配原始类型参数,而调用使用包装类型参数,或者反之亦然,则该方法仍然可以被认为是匹配的。
class Example {
    public void method(int a) {
        // ...
    }

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

调用 method(1)method(new Integer(1)) 都能匹配这两个方法。

  1. 自动装箱和拆箱:当基本类型值传递给包装类型参数时,会自动装箱为包装类型对象。当包装类型对象传递给基本类型参数时,会自动拆箱为基本类型值。
class Example {
    public void method(int a) {
        // ...
    }

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

调用 method(1)method(Integer.valueOf(1)) 都能匹配这两个方法。

  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) {
        // ...
    }
}

当调用 Shape shape = new Shape(); shape.draw(5); 时,JVM 会确定最匹配的方法为 draw(int size)。这是因为调用中提供了 size 参数,而没有提供 fill 参数,因此 draw(int size, boolean fill)

    🎜Conforme aux paramètres variables (Varargs) : 🎜Si une méthode est déclarée comme variadique, la méthode peut correspondre à n'importe quel nombre ou type de paramètres (y compris les types primitifs et les objets). Les méthodes variadiques doivent être déclarées comme dernière méthode. 🎜🎜rrreee🎜Appeler method(1) ou method(1, 2, "Hello") correspondra à method(Object... args). 🎜
      🎜🎜Conversion entre les types wrapper et les types primitifs : 🎜Types wrapper de type de base (tels que Integer) et types primitifs correspondants (tels que int >) peuvent être convertis les uns dans les autres. S'il existe une méthode qui correspond à un paramètre de type brut mais qui est appelée avec un paramètre de type encapsulé, ou vice versa, la méthode peut toujours être considérée comme une correspondance. 🎜🎜rrreee🎜Appelez method(1) ou method(new Integer(1)) pour faire correspondre ces deux méthodes. 🎜
        🎜🎜Autoboxing et unboxing : 🎜Lorsqu'une valeur de type primitif est transmise à un paramètre de type wrapper, elle est automatiquement encadrée dans un objet de type wrapper. Lorsqu'un objet de type encapsulé est transmis à un paramètre de type de base, il est automatiquement déballé dans une valeur de type de base. 🎜🎜rrreee🎜Appelez method(1) ou method(Integer.valueOf(1)) pour faire correspondre ces deux méthodes. 🎜
          🎜🎜Type de classe dérivé : 🎜Lorsqu'un appel utilise un paramètre d'un objet de classe dérivé, le paramètre peut également correspondre au paramètre de son type de classe de base. 🎜🎜rrreee🎜Appeler makeSound(new Dog()) correspondra également à la méthode makeSound(Animal a). 🎜🎜🎜Cas pratique🎜🎜🎜Supposons qu'il existe une classe Shape, qui a les méthodes suivantes : 🎜rrreee🎜Lors de l'appel de Shape shape = new Shape(); ;, la JVM déterminera que la meilleure méthode de correspondance est <code>draw(int size). En effet, le paramètre size a été fourni dans l'appel mais pas le paramètre fill, donc draw(int size, boolean fill) n'est pas un correspondance exacte . 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn