从构造函数调用 super() 的实际例子是什么?

What could be a practical example of calling super() from constructor?

我们知道可以从子 class 的构造函数中调用父 class 的构造函数。这可以通过调用 super 来完成,并且 super 应该是构造函数的第一条语句。

只是为了增加OOP概念的特性而保留的特性还是有实际应用?

如有实际应用,请说明。

请看这里,再回答:

求实际应用。这意味着在现实生活场景中,使用此功能而不是以其他方式进行工作将非常有用。

每个人都只是发布概念或代码如何工作。但我已经知道了。我只想要一个实际场景,它可以让我避免编写大量代码,或者不可能做其他事情。

假设父 class 需要构造函数参数,但子 class 不需要,因为它将提供该参数。您将显式调用以提供参数。

class Vehicle {
     private VehicleType type;

     Vehicle(VehicleType t) {
        this.type = t;
     }
}

class Car extends Vehicle {
    Car() {
        super(VehicleType.Car);
    }
}

这只是一个例子。另一个可能是如果父 class 的构造函数可能抛出异常,而子 class 想抛出一个更一般的异常(可能隐藏内部细节,也许父 class 不是't public):

class Parent {
     Parent() throws InternalException {
        // ...
     }
}

public class Child extends Parent {
    Child() throws PublicException {
        try {
            super();
        } catch (InternalException e) {
            throw new PublicException();
        }
    }
}

此功能在实践中非常有用,因为它可以让您重用父 class 初始化。

这是最基本的示例之一:

abstract class Positionable {
    private int x, y;
    public int getX() {return x;}
    public int getY() {return y;}
    protected Positionable(int x, int y) {
        this.x = x;
        this.y = y;
    }
}
class Circle extends Positionable {
    private int r;
    public int getR() {return r;}
    public Circle(int x, int y, int r) {
        super(x, y);
        this.r = r;
    }
}
class Rectangle extends Positionable {
    private int w, h;
    public int getH() {return h;}
    public int getW() {return w;}
    public Rectangle(int x, int y, int h, int w) {
        super(x, y);
        this.h = h;
        this.w = w;
    }
}

请注意 CircleRectangle 如何共享 Positionable 的构造函数的逻辑,而不是自己设置 xy(这将如果不支持从构造函数调用 super,则必须保护,而不是私有。

作为一个简短的回答,如果我理解你的话——如果你在超类构造函数中有一些 initialisation/setup 代码,你在子类中也需要这些代码,那么通过调用 super(..),你不会不需要在子类构造函数中复制它。

这是一个例子

class Person {

    String name;

    Person(String name) {
        this.name = name;
    }
}

class Employee extends Person {

    Employee(String name) {
        super(name);
    }
}

请注意,如果您没有显式调用 super,编译器会自动在构造函数的第一行添加一个 super(); 调用。这意味着如果你在上面的例子中删除 super(name); 调用,你会得到一个有点奇怪的编译错误,因为在超级 class.

中没有默认构造函数

如果您随后还删除 Person(String name) 构造函数,它将再次编译,因为如果没有显式指定构造函数,默认构造函数会自动添加到 Person class。

当然有实际应用。

我有一个 class 叫做寄存器,所以每当创建一个新的寄存器时,都会触发一封邮件给用户,这是构造函数的一个参数。

几天后,无论何时创建新的子寄存器,都需要将邮件发送给用户,并且应该创建一个数据库条目。

Subregisters 继承了寄存器,在它的构造函数中我们调用了 super(user) 然后调用了一个方法来创建数据库条目。

这就是你堆叠它的方式。可以有不同的父构造函数,或者您甚至可以使用 super.

调用父方法

java没有什么是无缘无故的,即使有也不会长久

Java 支持 Inheritance 特性,super() 关键字描述了 super class 的默认构造函数。您也可以在从 superclass 扩展 subclass 时使用 super(Params... params)。 OOP 在概念上需要继承 classes 以保持更精确的交互关系。