2010-04-21 60 views
0
public abstract class Person { 

    private String name; 

    public Person(String name) { 
     this.name = name; 
     System.out.println("Person"); 
    } 

    public String getName() { 
     return name; 
    } 

    abstract public String getDescription();  
} 


public class Student extends Person { 

    private String major; 

    public Student(String name, String major) { 
     super(name); 
     this.major = major; 
    } 

    public String getMajor() { 
     return major; 
    } 

    @Override 
    public String getDescription() { 
     return "student" + super.getName() + " having" + major; 
    } 

} 

public class PersonTest { 

    public static void main(String[] args) { 

     Person person = new Student("XYZ", "ABC"); 
     System.out.println(person.getDescription()); 

    } 

} 

問題:我們不能創建抽象類的對象,那麼爲什麼人類構造函數已被調用,甚至是抽象類?抽象類中的疑問

+1

相關:http://stackoverflow.com/questions/2623180/abstract-class-and-constructor,http://stackoverflow.com/questions/2105783/what-is-the-use-of-creating-a -constructor-for-an-abstract-class-in-java,http://stackoverflow.com/questions/260666/abstract-class-constructor-in-java – finnw 2010-04-21 09:19:20

+0

因爲它的抽象類可以有一些私有字段需要初始化。 – pmu 2010-04-21 11:08:35

回答

0

構造函數只是其他方法。

super(name); 
+0

即使我刪除Person構造函數,將會調用默認值。 – mohit 2010-04-21 09:17:23

2

因爲它仍然是一個類和它的構造函數被調用的對象實例化的一部分:你明確你的孩子類的構造函數與調用它。這是抽象的事實與此無關。

+0

那麼爲什麼Person對象不能創建explicilty,[違反Java Spec說] – mohit 2010-04-21 09:18:12

+1

@mohit:因爲它是'abstract',你不能直接調用它**,但你仍然可以使用'super()名字);',就像你所做的那樣。 – 2010-04-21 09:23:42

+1

@mohit:如果我們能夠實例化Person,那麼您希望新實例的getDescription()返回什麼?整個想法是Person是某種「模板」,其中有空白,由子類實現。 – 2010-04-21 09:26:10

0

Person構造函數是從Student類調用的。從Java tutorials

一個抽象類是一類就是 聲明爲abstract,它可能會或可能不會 包括抽象方法。摘要 類不能實例化,但 它們可以被分類。

0

抽象類可以有構造函數 - 它們不能直接調用,而只能作爲構建一個子類實例的一部分,通過在子類構造函數super()的調用。

1

你不能做的是創建一個抽象類的實例。 作爲學生「部分」的人super(...)初始化學生的「人物部分」,但不創建人物。

我希望你明白我嘗試說

0

一個不能做出abstract class的實例,但子類可以調用super(name);。儘管它是一個構造函數,但它只是另一種方法。

1

QUES:我們不能創造的 抽象類的話,爲什麼人 構造函數被調用,即使其 一個抽象類的對象?

如果某個類聲明爲抽象類,則不能創建該類的對象。 DOESNOT意味着你不能創建它的子類的對象。

您可以引用(類型爲抽象類)引用一個子類(非抽象)對象。

Person person = new Student(「XYZ」, 「ABC」);

爲了構建一個Student對象,你需要讓學生的「person」部分被初始化,那是什麼樣的抽象超類的構造函數被調用。

0

抽象類是整體具體類的一部分。抽象類是允許將許多部件推遲到其具體實現的類,但它仍必須自行初始化。

因此,它有一個構造函數,並且具有任何參數的構造函數都需要自行設置。

從Student類調用super(...)方法時,顯式調用Person模板類中的構造函數。 super()調用必須位於Person構造函數的第一行,因此如果您的person類想要覆蓋Person()構造函數設置的默認值,那麼您有該選項。但是當你擴展一個類(抽象或具體)時,必須調用恰好一個人構造函數。