2015-02-07 58 views
0

使用一個子類的二傳手我有一個超類Person和兩個子類男人和女人的Java:創建類型的對象時,超類

在子類中的人,我有一個實例變量年齡:

public class Man extends Person{ 

    private double age; 

    public final static double MIN_AGE = 0.0; 
    public final static double MAX_AGE = 65.0; 

    //no argument constructor 
    public Man(){ 
    super(); 
    initAge(); // This randomly selects age 
    } 

    /* Setters and getters */ 
    public void setAge (double ageIn) 
    { 
     /* Assign a value only if it is within the allowed range */ 
     if (ageIn>= MIN_AGE && ageIn<= MAX_AGE) 
     { 
     this.age = ageIn; 
     } 
     else if (ageIn< MIN_AGE) 
     { 
     this.age = MIN_AGE; 
     } 
     else if (ageIn > MAX_AGE) 
     { 
     this.age = MAX_AGE; 
     } 
    } 

    public double getAge() 
    { 
    return age; 
    } 
} 

現在,我的任務是創建一個人對象,測試是否二傳手作品和initAge工作是否通過展示時代」的價值:用getAge

我也有使用初始化對象以下內容:

Person p1 = new Man(); 

但是,如果以這種方式初始化,我就無法訪問Man的setter和getters。有沒有辦法解決這個問題:

Man p1 = new Man(); 

謝謝!

回答

1

演員p1Man

((Man) p1).setAge(13); 
+0

謝謝!它確實有用! – 2015-02-07 20:17:06

1

您可以添加抽象方法Person類:

public abstract class Person { 

    public abstract double getAge(); 
    public abstract setAge(double ageIn); 
} 

或者,如果方法是性別獨立性,將其移動到父,所以男人和女人可以繼承。

+0

謝謝。一個好主意,但我不能改變超類。無論如何,感謝您的幫助! – 2015-02-07 19:56:23

+0

在這種情況下,如果您確定引用是Man對象,則唯一可以執行的操作是使用強制轉換。 'if(p1 instance of Man) ((Man)p1).setAge(42);' – 2015-02-07 20:01:01

1

您將不得不使用Person p1 = new Man();,因爲如果您不想創建實例化的new Man()的Man對象,這是唯一的方法。

現在爲了以一個Person的形式訪問setter和getters,你需要通過將Man類型轉換爲Person來掩飾它。

((Man) p1).setAge(double)

相關問題