簡體   English   中英

Java 繼承:在超類中調用子類方法

[英]Java Inheritance: Calling a subclass method in a superclass

我對java很陌生,想知道是否可以在超類中調用子類方法。 如果進行繼承,在哪里設置public static void main的適當位置。

超類

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

}

子類

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

    }

}

我對java很陌生,想知道是否可以在超類中調用子類方法。

超類對其子類一無所知,因此,您不能在超類中調用子類實例方法。

設置 public static void main 的正確位置在哪里。

由於許多因素,我不建議將main方法放在Admin類或User類中。 而是創建一個單獨的類來封裝main方法。

示例:

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

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

簡短的回答:沒有。

中等答案:是的,但是您必須在超類中聲明該方法。 然后在子類中覆蓋它。 子類的方法體將在超類調用它時被調用。 在您的示例中,您可以在 User 上放置一個空的 getLevel 方法。

您還可以考慮將 User 聲明為抽象類,並在 User 類上將 getLevel 方法聲明為抽象類。 這意味着您不會在 User 類的 getLevel 中放置任何方法體,但每個子類都必須包含一個。 同時,User 可以引用 getLevel 並使用其子類的實現。 我認為這就是你想要的行為。

,不可能在超類中調用子類方法。

雖然可以在客戶端代碼中調用同一方法的不同實現,而您有一個具有超類類型的變量,並使用超類或子類對象對其進行實例化。 它被稱為多態性

請考慮以下示例:

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

回答您的第二個問題,不,只要具有正確的方法簽名,您將 main 方法放在哪里並不重要。 正如您在我的示例中看到的,我將方法移至 Admin.java - 它仍然可以接受。

在超類中調用子類方法是可能的,但在超類變量/實例上調用子類方法是不可能的。

在 java 中,所有靜態變量和方法都被認為是在類之外,即它們確實可以訪問任何實例變量或方法。 在上面的示例中,創建一個名為 Main 的新類並將 public static void main 放在那里是明智的,但這只是一個衛生問題,除了該行之外,上面的內容將起作用。

user1.getLevel()

用例:如果員工吃飯,那么自動應該睡覺:-)

  1. 從類person聲明eatsleep兩種方法。 eat調用sleep方法。

  2. employee類中擴展person並僅覆蓋sleep方法:

     Person emp=new Employee(); emp.eat();

說明:由於eat方法不在子類中,所以會調用超類eat 從那里,將調用子類的sleep

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM