有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在派生类中使用超级构造函数的目的

有人告诉我,将实例变量声明为受保护是不好的,而且由于超级类和子类之间的耦合增加,它被认为是不好的设计。相反,使用超级构造函数,如下所示:

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;
    }
}

但是,我想知道这样做的目的是什么,而不是将变量设置为protected,因为即使通过超级构造函数将值分配给x和y,私有值仍然无法访问。任何解释,如本用例的示例,将不胜感激


共 (3) 个答案

  1. # 1 楼答案

    私有土地不会被继承,这就是为什么保护土地被发明的原因

    一个类可以有自己的变量,而这些变量不能被另一个类修改

    The protected modifier specifies that the member can only be accessed within its own package (as with package-private) and, in addition, by a subclass of its class in another package.

    资料来源:https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

    enter image description here

    如果两个类都在同一个包下,则可以访问/修改(通过构造函数或getter/setter)声明为private或protected的变量。但是,如果变量是私有的,并且您从另一个包上的类进行扩展,那么您就不能这样做。如果变量受到保护,并且您从另一个包上的类进行扩展,那么您就可以这样做

  2. # 2 楼答案

    如果想要直接使用变量x和y,它们必须受到保护,但通常可以在Shape类中使用getter和setter方法来控制这些变量。我个人认为,最后一种方法更好地保证只有Shape类更改自己的属性,这是一种很好的实践,而且它使调试变得更容易

  3. # 3 楼答案

    我们使用super()构造函数是因为,假设一个名为Rectangle的不同类扩展了Shape类,即Rectangle extends Shape,即使矩形也有一个形状,因此通过使用super构造函数,它可以在父类(即Shape类)中设置数据<注意:形状和形状是不同的。Shape是class,Shape是英语单词Shape

    Java主要是关于代码的可重用性。在Shape类中,可以有一个对Square和Rectangle都通用的方法(比如area())来计算这两个类的面积。由于我们已经使用super()构造函数来设置属性(即x,y),我们不必为每个子类创建变量,我们只需要从两个子类调用area()方法,而不需要传递任何参数

    说到私有和受保护的东西,您使用受保护关键字的想法是正确的,但只有当x、y上没有验证时,Setter方法才是正确的。Setter方法不仅仅是设置属性值,它们实际上是用于验证的:

    public void setX(int x) {
                if(x>0)
                  this.x = x;
                else 
                  this.x=0;
            }
    

    如果您使用受保护的关键字,那么同一个包中的所有子类或类都可以直接访问属性,这在您使用企业应用程序时是一个巨大的威胁protected关键字并没有让我们有机会验证数据

    在上面的代码中,您可以继续使用并保护它(假设没有验证,并且您提供的数据总是准确的)。你这样想是对的。这并不是完全错误的。不同的方法荣誉