1

我试图了解 Java 中的面向对象编程,但我遇到了这个问题。

例如,我有一个这样的父类:

public class Shape {
    private int location;
    private Color color;
    // methods such as getLocation() and getColor()

    public Shape(int initialLocation, Color initialColor) {
        location = initialLocation;
        color = initialColor;
    }


}

如何创建我的子类,以便我可以在 main 方法中构造一个具有初始位置和初始颜色的矩形?我是否在 Rectangle 类中创建构造函数?我不能,因为位置和颜色是私有字段。我是否为位置和颜色创建访问器方法并在实例化后设置位置和颜色?我想,但是有没有办法在没有访问器的情况下做到这一点?

public class Rectangle extends Shape {
    public Rectangle(int initialLocation, Color initialColor) {
        super(initialLocation, initialColor);
    }

}

我只是无法理解这个基本概念。有什么帮助吗?

4

4 回答 4

4

重用构造函数

public class Shape {
    private int location;
    private Color color;

    public Shape(int location, Color color) {
        this.location = location;
        this.color = color;
    }
    // methods such as getLocation() and getColor()
}

public class Rectangle extends Shape {
    public Rectangle(int location, Color color /*, more */) { 
        super(location, color);
        // more
    }
}

这个官方教程解释了它的使用。

于 2013-09-28T20:50:24.873 回答
1

如果你想扩展变量,你可以将它们的修饰符更改为protected,这样它就可以被继承,否则private就像它们在子类中不存在一样。

于 2013-09-28T20:48:02.323 回答
1

尽管您可以将实例变量定义为protected,但这违背了面向对象的封装原则。我会为 Shape 类的每个实例变量使用 getter 和 setter。此外,如果您在 Shape 中创建构造函数,则可以在 Rectangle 中调用超级构造函数来设置 Rectangle 中的位置和颜色。

public class Rectangle extends Shape {
    public Rectangle(int location, Color color) { 
        super(location, color);
    }
}

只要你在 Shape 中有以下构造函数:

public class Shape {
    // location and color define.

    public Shape(int location, Color color) {
        this.location = location;
        this.color = color;
    }
    // getters and setters which are public for location and color
}
于 2013-09-28T20:50:43.537 回答
0

基类中只能由子类访问的私有成员毫无意义!如果您想阅读它们,您至少需要一个公共或受保护的吸气剂。如果要编写它们,则至少需要一个公共或受保护的 setter 和/或初始化它们的构造函数。

于 2013-09-28T20:51:07.813 回答