2016-01-23 82 views
0

我有一個任務,我需要創建一個抽象類,其中包含constructer和一個抽象方法,將被子類覆蓋。調用私有變量與抽象方法覆蓋

賦值的對象是確定不同多邊形的區域,同時使RegularPolygon類成爲基類。

當我通過子類擴展調用方法時,它打印出零。我知道問題是變量的範圍。基本上我知道我的變量方不是從超類中讀取的,因爲它的私有性。我不知道如何解決這個問題,而不需要把它從私人變爲公共或保護。它需要保持私密。

找到RegularPolygon

public abstract class RegularPolygon 
{ 
    private double side; 

    public RegularPolygon(double length) 
    { 
     side = length; 
    } 

    public abstract double getArea(); 
} 

廣場

public class Square extends RegularPolygon 
{ 
    private double side; 

    public Square(double length) 
    { 
     super(length); 
    } 

    public double getArea() 
    { 
     return side*side; //this returns 0 
    }  
} 

回答

1

一種方法是創建公共getSide()方法RegularPolygon來檢索side中的值。這樣,您將只能檢索side中的值,但仍無法更改它。

下面的代碼怎麼會是:

// Main.java 
public static void main(String[] args) { 
    Square sq = new Square(3); 
    System.out.println(sq.getArea()); // 9.0 
} 

這將是RegularPolygon類

public abstract class RegularPolygon 
{ 
    private double side; 

    public RegularPolygon(double length) 
    { 
     side = length; 
    } 

    public abstract double getArea(); 

    // Add this... 
    public double getSide() { 
     return side; 
    } 
} 

而且...... Square類

public class Square extends RegularPolygon{ 
    public Square(double length) 
    { 
     super(length); 
    } 
    public double getArea() 
    { 
     // use 'this.getSide()' to retrieve the value in 'side' 
     return this.getSide()*this.getSide(); 
    } 
} 
0

您不能訪問private場在給定的類在該類的擴展。因此,您在getArea()中訪問的sideside中的Square,它從不初始化。

對此的最佳實踐答案是爲side創建一個公共獲取者,以便子類可以訪問它(儘管不能編輯它)。

public abstract class RegularPolygon { 
    private double side; 

    public RegularPolygon(double length) { 
     side = length; 
    } 

    public double getSideLength() { 
     return side; 
    } 

    public abstract double getArea(); 
} 



public class Square extends RegularPolygon { 
    public Square(double length) { 
     super(length); 
    } 

    public double getArea() { 
     return getSideLength()*getSideLength(); 
    }  
} 

如果你特別想子類能夠直接訪問side場,使這protected代替private