[英]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()
用例:如果員工吃飯,那么自動應該睡覺:-)
從類person
聲明eat
和sleep
兩種方法。 從eat
調用sleep
方法。
在employee
類中擴展person
並僅覆蓋sleep
方法:
Person emp=new Employee(); emp.eat();
說明:由於eat
方法不在子類中,所以會調用超類eat
。 從那里,將調用子類的sleep
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.