2017-06-17 2 views
2

Ich bin sehr neu in Java und würde gerne wissen, ob das Aufrufen einer Unterklassenmethode in einer Oberklasse möglich ist. Und wenn Vererbung, wo ist der richtige Ort, um öffentlichen statischen void Haupt setzen.Java-Vererbung: Aufrufen einer Unterklassenmethode in einer Oberklasse

Superklasse

public class User { 
    private String name; 
    private int age; 

    public User() { 
     //Constructor 
    } 

    //Overloaded constructor 
    public User(String name, int age) { 
     this.name = name; 
     this.age = age; 
    } 

    public String getName() { 
     return this.name; 
    } 
    public static void main(String []args) { 
     User user1 = new Admin("Bill", 18, 2); 

     System.out.println("Hello "+user1.getName()); 
     user1.getLevel(); 
    } 

} 

Subclass

public class Admin extends User { 

    private int permissionLevel; 

    public Admin() { 
    //Constructor 
    } 

    //Overloading constructor 
    public Admin(String name, int age, int permissionLevel) { 
     super(name, age); 
     this.permissionLevel = permissionLevel; 
    } 

    public void getLevel() { 
     System.out.println("Hello "+permissionLevel); 

    } 

} 
+0

Nein, das ist nicht möglich. Eine Klasse hat keine Möglichkeit zu wissen, ob oder wann sie unterklassifiziert wurde. Ein Benutzer ist nicht immer ein Administrator, sondern ein Administrator ist ein Benutzer. Der Administrator kann übergeordnete Methoden aufrufen, jedoch nicht anders herum, es sei denn, Sie haben einen Benutzerverweis auf einen Administrator ausgeführt. – duffymo

+0

Ich habe es mir zur Gewohnheit gemacht, die Hauptmethode außerhalb aller "funktionalen" Klassen zu platzieren. In Ihrem Beispiel würde ich eine Klasse 'Funktionalität' erstellen, die die Hauptmethode und Ihre zwei zusätzlichen Klassen enthält. Was ist, wenn Sie eines Tages Funktionen programmieren, die nichts mit Benutzern zu tun haben? Der einfachste Anwendungsfall könnte darin bestehen, einen Hilfetext anzuzeigen, der nicht in die Klasse "User" passt, oder? – bleistift2

+0

Es sieht so aus, als ob man 'user1.getLevel()' 'entweder' user1' wie 'Admin user1' deklarieren muss oder' user1' wie '' ((Admin) user1) .getLevel umwandeln muss() '. –

Antwort

4

Ich bin zu Java sehr neu und möchte wissen, ob in einer Oberklasse eine Unterklasse Aufruf der Methode möglich ist.

Ein Super weiß nichts über ihre Unterklassen, daher können Sie nicht eine Unterklasse Instanz Methode in einer Superklasse aufrufen.

wo ist der richtige Ort, um öffentliche statische void main zu setzen.

Ich würde nicht empfehlen, die main Methode in der Klasse Admin setzen noch die User Klasse für viele Faktoren. Erstellen Sie stattdessen eine separate Klasse, um die main-Methode einzukapseln.

Beispiel:

public class Main{ 
    public static void main(String []args) { 
     User user1 = new Admin("Bill", 18, 2); 

     System.out.println("Hello "+user1.getName()); 
     user1.getLevel(); 
    } 
} 
+0

Wenn ich die Frage richtig verstehe, scheint es, dass die Frage über eine 'statische' Methode in der Oberklasse steht, in der es sicher möglich ist, die Methode einer Unterklasse aufzurufen. Es ist nur unmöglich, wenn Sie versuchen, eine Subclass-Methode für das "This" der Superklasse aufzurufen. –

0

Aufruf Unterklasse Methode in einer Oberklasse möglich ist, aber eine Unterklasse Methode auf einem übergeordneten Klasse Variable Aufruf/Instanz ist nicht möglich.

In Java werden alle statischen Variablen und Methoden als außerhalb der Klasse betrachtet, d. H. Sie haben Zugriff auf beliebige Instanzvariablen oder -methoden. In Ihrem obigen Beispiel ist es ratsam, eine neue Klasse mit dem Namen Main zu erstellen und die statische void main-Komponente dort einzutragen, aber das ist nur ein Hygieneproblem, und was Sie oben haben, wird mit Ausnahme der Zeile funktionieren.

user1.getLevel() 
0

Nr, ist es nicht möglich, Unterklassenmethode innerhalb Superklasse aufzurufen.

Es ist zwar möglich, verschiedene Implementierungen derselben Methode in einem Clientcode aufzurufen, während Sie eine Variable mit einem Superklasse-Typ haben, und diese entweder mit Superklassen- oder Subklassenobjekten zu instanziieren. Es heißt Polymorphismus.

Bitte betrachten Sie das folgende Beispiel:

public class User { 
    private String name; 
    private int age; 
    protected int permissionLevel; 

    public User() { 
     //Constructor 
    } 

    //Overloaded constructor 
    public User(String name, int age) { 
     this.name = name; 
     this.age = age; 
    } 

    public String getName() { 
     return this.name; 
    } 

    public void getLevel() { 
     System.out.println("Hello "+ permissionLevel); 
    } 
} 

public class Admin extends User { 

    public Admin() { 
     //Constructor 
    } 

    //Overloading constructor 
    public Admin(String name, int age, int permissionLevel) { 
     super(name, age); 
     this.permissionLevel = permissionLevel; 
    } 

    @Override 
    public void getLevel() { 
     System.out.println("Hello "+permissionLevel); 
    } 

    public static void main(String []args) { 
     User user1 = new Admin("Bill", 18, 2); 

     System.out.println("Hello "+user1.getName()); 
     user1.getLevel(); //call to subclass method 

     user1 = new User("John", 22); //the variable is the same but we assign different object to it 
     user1.getLevel(); //call to superclass method 
    } 
} 

Ihre zweite Frage zu beantworten, nein, es ist egal, wo Sie Ihre Hauptmethode setzen, solange es die richtigen Methode Signatur ist. Wie Sie in meinem Beispiel sehen können, habe ich die Methode nach Admin.java verschoben - sie ist immer noch akzeptabel.

0

Kurze Antwort: Nein.

Medium Antwort: Ja, aber Sie haben die Methode in der übergeordneten Klasse zu erklären. Überschreibe es dann in der Unterklasse.Der Methodenhauptteil aus der Unterklasse wird aufgerufen, wenn die Oberklasse ihn aufruft. In Ihrem Beispiel könnten Sie einfach eine leere Methode getLevel auf User setzen.

Sie könnten auch den Benutzer als abstrakte Klasse deklarieren und die getLevel-Methode als Abstract für die User-Klasse deklarieren. Das bedeutet, dass Sie in getLevel der User-Klasse keinen Methodenkörper einfügen, aber jede Unterklasse müsste einen enthalten. In der Zwischenzeit kann der Benutzer auf getLevel verweisen und die Implementierung seiner Unterklasse verwenden. Ich denke, das ist das Verhalten, das du hier anstrebst.

Verwandte Themen