如何使用父类中的字段实例化对象?

时间:2013-09-28 20:45:25

标签: java object inheritance

我试图了解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;
    }


}

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

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

}

我无法绕过这个基本概念。有什么帮助吗?

4 个答案:

答案 0 :(得分: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
    }
}

official tutorial解释了它的用法。

答案 1 :(得分:1)

如果要扩展变量,可以将其修饰符更改为protected,这样就可以继承它,否则private就像它们对于子类不存在一样。

答案 2 :(得分:1)

尽管您可以将实例变量定义为protected,但这违反了面向对象的封装原则。我会为类Shape的每个实例变量使用getter和setter。另外,如果在Shape中创建一个Constructor,你可以调用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
}

答案 3 :(得分:0)

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