2013-06-29 93 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,或者如果它位于同一个包中,则不需要修饰符,但如果更改包,则无法再访问。

顺便说一句,使用限制性最强的访问级别对特定成员有意义。除非你有充分的理由不要私下使用,否则你有理由不得不使用他人。