我被教导说,将实例变量声明为受保护是不好的,并且由于超类和子类之间的耦合增加而被认为是糟糕的设计。相反,使用超级构造函数如下:
public class Shape{
private int x, y;
public Shape(int px, int py) {
x = px;
y = py;
}
}
public class Square extends Shape {
int size;
public Square(int px, int py, int sz) {
super(px, py);
size = sz;
}
}
然而,我想知道做这样的事情的意义或目的是什么,而不是将变量设置为proctected,即使在通过超级构造函数将值赋给x和y之后,私有值仍然无法访问。任何解释,例如此用例的示例将不胜感激!
答案 0 :(得分:0)
如果要直接使用变量x和y,它们必须受到保护,但通常可以在Shape类中使用getter和setter方法来控制这些变量。我个人认为最后一种方法更好地保证只有Shape类改变它自己的属性,这是一个很好的做法,它使调试更容易。
答案 1 :(得分:0)
私有字段不会被继承,这也是发明Protected的原因。
一个类可以有自己的变量,这些变量不能被另一个类修改。
protected修饰符指定只能访问该成员 在它自己的包中(与package-private一样),另外,通过 另一个包中其类的子类。
来源:https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
如果两个类都在同一个Package下,则可以访问/修改(通过构造函数或getter / setter)声明为private或protected的变量。但是,如果变量是私有的,并且您从另一个包上的类扩展,则无法执行此操作。如果变量受到保护并且您从另一个包上的类扩展,则可以执行此操作。
答案 2 :(得分:0)
我们使用super()构造函数因为,想象一个名为Rectangle的不同类,它扩展了Shape类,即Rectangle extends Shape
,甚至Rectangle也有一个形状,所以通过使用超级构造函数,它在Parent类中设置数据(即Shape类)。 注意:形状和形状不同。形状是类,形状是英文单词形状
Java主要是关于代码可重用性。可以有一个方法(让我们说区域()),它在Shape类中的Square和Rectangle都是通用的,用于计算两个类的区域。由于我们已经使用super()构造函数来设置属性(iex,y),我们不必为每个子类创建变量,我们只需调用该区域( )来自两个子类的方法,不传递任何参数。
来到私有和受保护的东西,你在考虑使用protected关键字是正确的,但只有在x,y上没有验证时才是正确的。 Setter方法不仅仅是设置属性值,它们实际上是用于验证:
public void setX(int x) {
if(x>0)
this.x = x;
else
this.x=0;
}
如果使用protected关键字,那么同一个包中的所有子类或类都可以直接访问属性,这在使用企业应用程序时是一个巨大的威胁。 protected
关键字不会让我们有机会验证数据。
在您的上述代码中,您可以继续使用它受保护(假设没有验证,并且您提供的数据始终准确)。你这样想是正确的。这并非完全错误。不同的方法。 Kudos !!