我试图了解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);
}
}
我无法绕过这个基本概念。有什么帮助吗?
答案 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和/或初始化它们的构造函数。