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

时间:2018-02-21 02:16:47

标签: java inheritance

我被教导说,将实例变量声明为受保护是不好的,并且由于超类和子类之间的耦合增加而被认为是糟糕的设计。相反,使用超级构造函数如下:

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之后,私有值仍然无法访问。任何解释,例如此用例的示例将不胜感激!

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

私有字段不会被继承,这也是发明Protected的原因。

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

  

protected修饰符指定只能访问该成员   在它自己的包中(与package-private一样),另外,通过   另一个包中其类的子类。

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

enter image description here

如果两个类都在同一个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 !!