Heim  >  Artikel  >  Java  >  Beispiele für die Verwendung von Parametern variabler Länge in Java

Beispiele für die Verwendung von Parametern variabler Länge in Java

零下一度
零下一度Original
2018-05-29 09:20:531591Durchsuche

Variable Parameter (Varargs) werden in Java5 bereitgestellt, d. h. in der Methodendefinition kann eine unbestimmte Anzahl von Parametern verwendet werden, und dieselbe Methode kann mit einer unterschiedlichen Anzahl von Parametern aufgerufen werden, z. ); print("hello", "lisi");print("hello", "Zhang San", "alexia"); Im Folgenden wird beschrieben, wie Parameter variabler Länge definiert und verwendet werden.

1. Definition von Parametern variabler Länge

Verwenden Sie ..., um Parameter variabler Länge darzustellen, zum Beispiel

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

in einem Variablen- Längenparameter Parameter können als Arrays in Methoden verwendet werden, sodass beispielsweise alle Parameterwerte in einer Schleife ausgegeben werden können.

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

2. Aufrufen von Methoden mit Parametern variabler Länge

Sie können beim Aufruf eine beliebige Anzahl von Parametern oder keine Parameter angeben, zum Beispiel:

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

3. Regeln für die Verwendung von Parametern variabler Länge

3.1 Wenn eine Methode aufgerufen wird und mit der Methode mit festen Parametern oder der Methode mit Parametern variabler Länge übereinstimmen kann, wählen Sie eine Methode mit festen Parametern. Sehen Sie sich die Ausgabe des folgenden Codes an:

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 Wenn die aufzurufende Methode mit zwei variablen Parametern übereinstimmen kann, tritt ein Fehler auf, z. B. der folgende Code:

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");
    }
}

Für den oben genannten Code können beide Aufrufe in der Hauptmethode nicht kompiliert werden, da der Compiler nicht weiß, welche Methode er aufrufen soll, wie unten gezeigt:

3.3 Eine Methode kann nur einen Parameter variabler Länge haben und Dies Der Parameter variabler Länge muss der letzte Parameter der Methode sein

Die folgenden beiden Methodendefinitionen sind falsch.

public void test(String... strings,ArrayList... list){

}

public void test(String... strings,ArrayList... list){

}

4. Spezifikationen für die Verwendung von Parametern variabler Länge

4.1 Überladung von Methoden mit Parametern variabler Länge vermeiden: wie in 3.1 , Obwohl der Compiler weiß, wie man aufruft, können Menschen leicht in Aufruffallen und Missverständnisse tappen

4.2 Lassen Sie nicht zu, dass Nullwerte und leere Werte Methoden mit variabler Länge bedrohen, wie in 3.2 gezeigt Veranschaulichen Sie den Aufruf von Nullwerten. Geben Sie ein weiteres Beispiel:

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);
    }
}

Zu diesem Zeitpunkt werden Sie feststellen, dass beide Aufrufe nicht kompiliert werden können:

Da beide Methoden übereinstimmen, weiß der Compiler es nicht Welches soll ausgewählt werden, damit ein Fehler gemeldet wird? Hier gibt es auch eine sehr schlechte Codierungsgewohnheit, das heißt, der Aufrufer verbirgt den tatsächlichen Parametertyp, was sehr gefährlich ist Anruf, aber der Angerufene kann auch eine chaotische Situation mit interner Logik erzeugen. Für dieses Beispiel sollten folgende Änderungen vorgenommen werden:

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

4.3 Das Überschreiben von Methoden mit variabler Länge muss ebenfalls den Regeln folgen

Schauen wir uns an Anhand eines Beispiels rät jeder, ob das Programm kompiliert und weitergegeben werden kann:

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");
    }
}

Fühlt sich das nicht seltsam an?

Der erste kann kompiliert und übergeben werden. Tatsächlich transformiert das Basisobjekt das Unterklassenobjekt sub nach oben. Die formale Parameterliste wird von der übergeordneten Klasse bestimmt und kann natürlich übergeben werden. Beim direkten Aufruf der Unterklasse stellt der Compiler fest, dass die Unterklasse die Druckmethode der übergeordneten Klasse überschrieben hat und daher die von der Unterklasse neu definierte Druckmethode verwenden muss. Auch wenn die Parameterliste nicht übereinstimmt, wird sie nicht ausgeführt Versuchen Sie den Abgleich erneut, denn wenn Sie ihn einmal gefunden haben, wird nicht mehr danach gesucht, sodass ein Typkonfliktfehler vorliegt.

Dies ist ein Sonderfall. Die Liste der überschriebenen Methodenparameter kann sich von der der übergeordneten Klasse unterscheiden. Dies verstößt gegen die Definition des Überschreibens und führt zu unerklärlichen Fehlern.

Fassen Sie hier die Bedingungen zusammen, die zum Überschreiben erfüllt sein müssen:

(1) Die überschreibende Methode kann die Zugriffsrechte nicht reduzieren.

(2) Die Parameterliste muss sein derselbe wie der, der überschrieben wird. Die Methoden sind dieselben (einschließlich der Anzeigeform); Die überschriebene Methode kann keine neuen Ausnahmen oder Ausnahmen auslösen, die den Bereich der übergeordneten Klasse überschreiten, kann jedoch weniger, eingeschränktere Ausnahmen oder keine Ausnahmen auslösen.

Geben Sie abschließend ein Beispiel mit einer Falle. Jeder sollte die Ausgabe kennen:

Das obige ist der detaillierte Inhalt vonBeispiele für die Verwendung von Parametern variabler Länge in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn