2013-06-29 101 views
0

我對Java相當新,所以我試圖實現一個例子,並使用抽象類 但我缺乏面向對象的知識使我想知道爲什麼我不能使用抽象類中的私有變量「具體」類擴展它。java:抽象類和它的變量

這裏是我的代碼:

abstract class Equation{ 
    private double[] c;//oefficient 
    public static int degree(double[] coeff) { 
     return coeff.length; 
    } 
    public abstract double[] solve(); 
} 

class QuadraticEquation extends Equation{ 
    public double[] solve() { 
     double[] solution; 
     double discriminant = c[1]*c[1]-4*c[0]*c[2]; 
     if (discriminant < 0) { 
      solution = new double[] {Double.NaN,Double.NaN}; 
     } 
     else { 
      solution = new double[] {(c[1]+Math.sqrt(discriminant))/(2*c[0]) 
            ,(c[1]-Math.sqrt(discriminant))/(2*c[0])}; 
     } 
     return solution; 
    } 
} 

我得到的錯誤是

c has private access in Equation 

我可以通過使c一個public變量解決這個問題,但我想有一個更好的方式來做到這一點。

底線:如何訪問變量c

+2

而不是記錄什麼'c'意味着評論,爲什麼不首先命名您的變量'係數'?爲什麼這個變量在基類中定義,因爲它根本沒有使用它? –

+0

(1)對不起,我忘了重命名它; (2)它在子類中用於計算解 – epsilonhalbe

+0

如果它只用於子類中,則在子類中聲明它。 –

回答

3

您正在尋找的解決方案是使c受保護,以便它可以看到子類。

0

你可以在你的抽象類中寫一個公共Getter public double[] getC() { return c; }

+0

爲什麼要公開? –

+0

所以,如果你想......你可以使用方程以外的c ... – Tim

+1

通過這個邏輯,爲什麼我們不公開所有東西?曾聽說過封裝? –

2

很簡單,

Modifier Class Package Subclass World 
public  Y   Y  Y  Y 
protected Y   Y  Y  N 
no modifier Y   Y  N  N 
private  Y   N  N  N 

請參閱下表,你有private然後檢查你的子類可以訪問NO。您必須使用protected,或者如果它位於同一個包中,則不需要修飾符,但如果更改包,則無法再訪問。

順便說一句,使用限制性最強的訪問級別對特定成員有意義。除非你有充分的理由不要私下使用,否則你有理由不得不使用他人。