变量具有私有访问权

时间:2014-05-05 01:07:35

标签: java variables subclass private abstract

我试图为矩形和椭圆创建一个抽象的形状类我给出的唯一抽象方法就是draw方法,但在我给它一个构造函数之后,它给了我一个错误,在矩形类中说这里的颜色和其他变量有私人访问权限是我的代码:

public abstract class Shape{
        private int x, y, width, height;
        private Color color;
        public Shape(int x, int y, int width, int height, Color color){
            setXY(x, y);
            setSize(width, height);
            setColor(color);
        }

        public boolean setXY(int x, int y){
            this.x=x;
            this.y=y;
            return true;
        }

        public boolean setSize(int width, int height){
            this.width=width;
            this.height=height;
            return true;
        }

        public boolean setColor(Color color){
            if(color==null)
                return false;
            this.color=color;
            return true;
        }

        public abstract void draw(Graphics g);
    }

    class Rectangle extends Shape{
        public Rectangle(int x, int y, int width, int height, Color color){
            super(x, y, width, height, color);
        }

        public void draw(Graphics g){
            setColor(color);
            fillRect(x, y, width, height);
            setColor(Color.BLACK);
            drawRect(x, y, width, height);
        }
    }

    class Ellipse extends Shape{
        public Ellipse(int x, int y, int width, int height, Color color){
            super(x, y, width, height, color);
        }

        public void draw(Graphics g){
            g.setColor(color);
            g.fillOval(x, y, width, height);
            g.setColor(Color.BLACK);
            g.drawOval(x, y, width, height);
        }
    }

2 个答案:

答案 0 :(得分:2)

private int x, y, width, height;表示只能从声明它们的实际类中访问它们。您应该创建适当的getset方法并使用它们。您希望字段为publicprotected以使用点表示法访问它们,但IMO是一种更好的设计,可以将它们保密,并使用getset。另请参阅解释字段可见性的In Java, difference between default, public, protected, and private

答案 1 :(得分:0)

g.setColor(color);
g.fillOval(x, y, width, height);

所有这些字段都是父类的私有字段。

您无法从类外部访问私有字段,甚至无法从子类访问。

您可以将字段更改为protected或为要调用的子类提供getter。

所以在Shape中添加一个方法

protected Color getColor(){  return color; }

然后你可以做

g.setColor(getColor());
你的子类中的

。其他领域也一样。