2017-06-17 108 views
2

我對java很陌生,想知道是否可以調用超類中的子類方法。如果要繼承,請在適當的地方設置public static void mainJava繼承:在超類中調用子類方法

超類

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

    } 

} 
+0

不,這是不可能的。一個班級無法知道是否或何時被分類。用戶並不總是管理員,而是管理員IS-A用戶。管理員可以調用父方法,但不能以其他方式進行調用,除非將用戶引用投射到管理員。 – duffymo

+0

我養成了在所有「功能」類之外放置主要方法的習慣。在你的例子中,我會創建一個類'功能',它包含主要方法和你的兩個額外的類。如果你的程序可能有一天會提供與用戶無關的功能。最簡單的用例可能會顯示一個幫助文本 - 不適合User類,可以嗎? – bleistift2

+0

一眼就看出來,爲了調用'user1.getLevel()',你需要像'Admin user1'那樣聲明'user1'或者像''((Admin)user1)那樣聲明'user1' .getLevel ()'。 –

回答

4

我很新的Java和想知道是否調用父類的子類 方法是可行的。

超類不知道它們的子類東西,所以,你不能調用父類的子類的實例方法

其中是設置公共靜態void main的適當位置。

我不會建議把在Admin類的main方法也不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(); 
    } 
} 
+0

如果我正確地理解了這個問題,看起來問題是關於超類中包含的'static'方法,在這種方法中,當然可以調用子類的方法。如果你試圖在超類的'this'上調用一個sublcass方法,這是不可能的。 –

0

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

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

user1.getLevel() 
0

沒有,則無法調用父類中的子類的方法。

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

請考慮下面的例子:

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

回答你的第二個問題,不,這不要緊,你把你的主要方法,只要是正確的方法簽名。正如你在我的例子中看到的那樣,我把這個方法移到了Admin.java--它仍然是可以接受的。

0

簡短的回答:

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

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