2017-10-24 3 views
1

Ich weiß, über anonyme class.We es verwenden können, Klasse methods.This außer Kraft zu setzen ist ein Beispiel:hinzufügen neue Methode zur vorhandenen Klasse

public class User { 
    private final String name; 
    public User(final String name){ 
     this.name=name; 
    } 
    public void sayHello(){ 
     System.out.println("Hello : "+name); 
    } 
    public static void main(String[] args) { 
     User s = new User("CHORT"){ 
     @Override 
     public void sayHello(){ 
      System.out.println("HELLO FROM ANONYMOUS CLASS"); 
     } 
    }; 

    } 
} 

aber ich bemerkte, dass die folgende Konstruktion auch korrekt ist (nicht hervorgehoben durch meine Idee)

public class User { 
    private final String name; 
    public User(final String name){ 
     this.name=name; 
    } 
    public void sayHello(){ 
     System.out.println("Hello : "+name); 
    } 
    public static void main(String[] args) { 
     User s = new User("CHORT"){ 

     public void sayHello2(){ 
      System.out.println("HELLO FROM ANONYMOUS CLASS"); 
     } 
    }; 

    } 
} 

Aber wenn ich Methode sayHello2 nennen wollen, mich IDEA zeigen, dass es nicht exist.What der Zweck dieser Konstruktion ist?

Antwort

4

Zunächst ist der Titel der Frage falsch. Sie haben keine neue Methode zur vorhandenen Klasse hinzugefügt. Sie haben eine Methode zu einer anonymen Klasse hinzugefügt, die eine vorhandene Klasse erweitert.

Anonyme Klassen können alle Methoden enthalten, die normale Klassen verwenden. Sie müssen nicht nur Methoden der Klasse enthalten, die sie erweitern, oder die Schnittstelle, die sie implementieren.

Daher ist die Definition sayHello2 in Ihrer anonymen Klasse vollkommen gültig, aber ziemlich nutzlos, da Sie diese Methode nicht außerhalb des anonymen Klassenkörpers aufrufen können.

Auf der anderen Seite kann es sinnvoll sein, wenn man es aus der anonymen Klasse Körper rufen Sie (und Sie können es private machen, da sie nicht von außen ohnehin aufgerufen werden kann):

User s = new User("CHORT") { 
    @Override 
    public void sayHello() { 
     sayHello2(); 
    } 
    private void sayHello2() { 
     System.out.println("HELLO FROM ANONYMOUS CLASS"); 
    } 
}; 

EDIT: Eine andere Sache, über die ich nachgedacht habe - Sie können wahrscheinlich Reflection verwenden, um Ihre sayHello2 von draußen anzurufen, obwohl ich mir nicht sicher bin, warum Sie das jemals tun wollten.

Verwandte Themen