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

Java 如何使用父类中的字段实例化对象?,java,object,inheritance,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 = ini

我试图理解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方法中构造一个具有初始位置和初始颜色的矩形?我是否在矩形类中创建构造函数?我不能,因为位置和颜色是私有字段。我是否为位置和颜色创建访问器方法,并在实例化后设置位置和颜色?我想,但是有没有一种方法可以在没有访问器的情况下做到这一点

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

}

我就是不能理解这个基本概念。有什么帮助吗?

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

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

重用构造函数

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 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()
}


这就解释了它的用法。

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

public class Rectangle extends Shape {
    public Rectangle(int location, Color color) { 
        super(location, color);
    }
}
只要您具有以下形状的构造函数:

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
}

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

public class Rectangle extends Shape {
    public Rectangle(int location, Color color) { 
        super(location, color);
    }
}
只要您具有以下形状的构造函数:

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
}

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

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

可以通过调用
super(…)
重用父类的构造函数。或者使用设置器。
矩形
究竟为什么要扩展
车辆
?@RohitJain车辆?“哪里?”杜克林说。嗯。问题现在被编辑了。很抱歉,哈哈,看了多个例子让我头晕目眩。你可以通过
super(…)
调用重用父类的构造函数。或者使用设置器。
矩形
究竟为什么要扩展
车辆
?@RohitJain车辆?“哪里?”杜克林说。嗯。问题现在被编辑了。很抱歉,哈哈,看着多个让我头晕目眩的例子。@Giga你还有问题吗?是的,如果我有更长的继承层次结构。例如,形状->移动形状->矩形。我必须以同样的方式为MovingShape类创建一个构造函数。对吗?@Giga是的,你知道。请注意,如果您的父母有一个构造函数,您的孩子必须通过
super()
调用显式调用它。@Giga您还有问题吗?是的,如果我有更长的继承层次结构。例如,形状->移动形状->矩形。我必须以同样的方式为MovingShape类创建一个构造函数。对吗?@Giga是的,你知道。请注意,如果父级有构造函数,则子级必须通过
super()
调用显式调用它。