Maison  >  Article  >  Java  >  Exemples d'utilisation de paramètres de longueur variable en Java

Exemples d'utilisation de paramètres de longueur variable en Java

零下一度
零下一度original
2018-05-29 09:20:531564parcourir

Les paramètres variables (varargs) sont fournis en Java5, c'est-à-dire qu'un nombre incertain de paramètres peut être utilisé dans la définition de la méthode, et la même méthode peut être appelée avec un nombre différent de paramètres, tels que print("hello" ); print("hello","lisi");print("hello","Zhang San", "alexia");Ce qui suit décrit comment définir des paramètres de longueur variable et comment utiliser des paramètres de longueur variable.

1. Définition des paramètres de longueur variable

Utiliser... pour représenter des paramètres de longueur variable, par exemple,

print(String... args){
   ...
}

dans une variable- paramètre de longueur Les paramètres peuvent être utilisés comme tableaux dans les méthodes, par exemple, toutes les valeurs des paramètres peuvent être sorties dans une boucle.

print(String... args){
   for(String temp:args)
      System.out.println(temp);
}

2. Appel de méthodes avec des paramètres de longueur variable

Vous pouvez donner n'importe quel nombre de paramètres ou aucun paramètre lors de l'appel, par exemple :

print();
print("hello");
print("hello","lisi");
print("hello","张三", "alexia")

3. Règles d'utilisation des paramètres de longueur variable

3.1 Lors de l'appel d'une méthode, si elle peut correspondre à la méthode à paramètre fixe ou à la méthode à paramètre de longueur variable, alors choisissez une méthode à paramètre fixe. Regardez la sortie du code suivant :

package com;

// 这里使用了静态导入
import static java.lang.System.out;

public class VarArgsTest {

    public void print(String... args) {
        for (int i = 0; i < args.length; i++) {
            out.println(args[i]);
        }
    }

    public void print(String test) {
        out.println("----------");
    }

    public static void main(String[] args) {
        VarArgsTest test = new VarArgsTest();
        test.print("hello");
        test.print("hello", "alexia");
    }
}

3.2 Si la méthode à appeler peut correspondre à deux paramètres variables, une erreur se produit, comme le code suivant :

package com;

// 这里使用了静态导入
import static java.lang.System.out;

public class VarArgsTest1 {

    public void print(String... args) {
        for (int i = 0; i < args.length; i++) {
            out.println(args[i]);
        }
    }

    public void print(String test,String...args ){
          out.println("----------");
    }

    public static void main(String[] args) {
        VarArgsTest1 test = new VarArgsTest1();
        test.print("hello");
        test.print("hello", "alexia");
    }
}

Pour ce qui précède Dans le code, les deux appels dans la méthode principale ne peuvent pas être compilés car le compilateur ne sait pas quelle méthode appeler, comme indiqué ci-dessous :

3.3 Une méthode ne peut avoir qu'un seul paramètre de longueur variable, et this Le paramètre de longueur variable doit être le dernier paramètre de la méthode

Les deux définitions de méthode suivantes sont fausses.

test de vide public (chaîne... chaînes, liste ArrayList){

}

test de vide public (chaîne... chaînes, liste ArrayList...){

}

4. Spécifications pour l'utilisation de paramètres de longueur variable

4.1 Évitez de surcharger les méthodes avec des paramètres de longueur variable : comme en 3.1 , bien que le compilateur sache comment appeler, les gens peuvent facilement tomber dans des pièges d'appel et des malentendus

4.2 Ne laissez pas les valeurs nulles et les valeurs vides menacer les méthodes de longueur variable, comme indiqué en 3.2, afin de illustrer l'appel de valeurs nulles, Donnez un autre exemple :

package com;public class VarArgsTest1 {

    public void print(String test, Integer... is) {
        
    }

    public void print(String test,String...args ){
          
    }

    public static void main(String[] args) {
        VarArgsTest1 test = new VarArgsTest1();
        test.print("hello");
        test.print("hello", null);
    }
}

À ce stade, vous constaterez que les deux appels ne parviennent pas à compiler :

Parce que les deux méthodes correspondent, le compilateur ne sait pas lequel choisir, donc il signale une erreur, il y a aussi une très mauvaise habitude de codage ici, c'est-à-dire que l'appelant cache le type de paramètre réel, ce qui est très dangereux. Non seulement l'appelant doit "deviner" quelle méthode utiliser. appel, mais l'appelé peut également générer une logique interne Situation chaotique. Pour cet exemple, les modifications suivantes doivent être apportées :

    public static void main(String[] args) {
        VarArgsTest1 test = new VarArgsTest1();
        String[] strs = null;
        test.print("hello", strs);
    }

4.3 L'écrasement des méthodes de longueur variable doit également suivre les règles

Regardons Dans l'exemple ci-dessous, tout le monde devine si le programme peut être compilé et transmis :

package com;

public class VarArgsTest2 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // 向上转型
        Base base = new Sub();
        base.print("hello");
        
        // 不转型
        Sub sub = new Sub();
        sub.print("hello");
    }

}

// 基类
class Base {
    void print(String... args) {
        System.out.println("Base......test");
    }
}

// 子类,覆写父类方法
class Sub extends Base {
    @Override
    void print(String[] args) {
        System.out.println("Sub......test");
    }
}

La réponse est bien sûr qu'il ne peut pas être compilé. Cela ne semble-t-il pas étrange ?

Le premier peut être compilé et transmis. Pourquoi ? En fait, l'objet de base transforme vers le haut l'objet de sous-classe sub. La liste formelle des paramètres est déterminée par la classe parent, et bien sûr elle peut passer. En regardant l'appel direct de la sous-classe, le compilateur voit que la sous-classe a remplacé la méthode d'impression de la classe parent, elle doit donc utiliser la méthode d'impression redéfinie par la sous-classe. Même si la liste de paramètres ne correspond pas, elle ne s'exécutera pas. à la classe parent, essayez à nouveau de faire correspondre, car une fois que vous l'aurez trouvé, vous ne le chercherez plus, il y a donc une erreur d'incompatibilité de type.

Il s'agit d'un cas particulier. La liste des paramètres de méthode remplacée peut être différente de la classe parente. Cela viole la définition de la substitution et provoquera des erreurs inexplicables.

Ici, résumez les conditions qui doivent être remplies pour l'écrasement :

(1) La méthode de remplacement ne peut pas réduire les droits d'accès

(2) La liste des paramètres doit être la suivante ; identique à celle qui est remplacée Les méthodes sont les mêmes (y compris le formulaire d'affichage);

(3) Le type de retour doit être le même que la méthode remplacée ou sa sous-classe

(4) La méthode substituée ne peut pas générer de nouvelles exceptions ou des exceptions qui dépassent la portée de la classe parent, mais peut générer moins d'exceptions, plus limitées, ou aucune exception.

Enfin, donnez un exemple avec un piège. Tout le monde devrait connaître le résultat :

package com;

public class VarArgsTest {
    public static void m1(String s, String... ss) {
        for (int i = 0; i < ss.length; i++) {
            System.out.println(ss[i]);
        }
    }

    public static void main(String[] args) {

        m1("");
        m1("aaa");
        m1("aaa", "bbb");
    }
}

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