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

时间:2016-05-12 10:55:43

标签: java oop super

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

它是否只是为了增加OOP概念的功能或者有任何实际应用而保留的功能?

如果有任何实际应用,请说明。

请在回答之前先看一下:

我要求实际应用。这意味着一个现实生活场景,使用此功能非常有用,而不是以其他方式完成工作。

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

6 个答案:

答案 0 :(得分:5)

假设父类需要构造函数参数,但子类不会因为它将提供该参数。您必须明确拨打电话才能提供参数。

class Vehicle {
     private VehicleType type;

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

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

这只是一个例子。另一个可能是如果父类的构造函数可能抛出异常,并且子类想要抛出更一般的异常(可能隐藏内部细节,也许父类不公开):

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

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

答案 1 :(得分:3)

此功能在实践中非常有用,因为它允许您重用父类初始化。

以下是最基本的例子之一:

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调用,则受保护,而不是私有。)

答案 2 :(得分:0)

如果我理解你的话,作为一个简短的答案 - 如果你在超类构造函数中有一些初始化/设置代码,你在子类中也需要它,那么通过调用super(..),你就不需要了在子类构造函数中复制它。

答案 3 :(得分:0)

这是一个例子

class Person {

    String name;

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

class Employee extends Person {

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

请注意,如果您未明确调用super,编译器会在构造函数的第一行自动添加super();调用。这意味着如果在上面的示例中删除super(name);调用,则会出现一些奇怪的编译错误,因为超类中没有默认构造函数。

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

答案 4 :(得分:0)

当然有实际应用。

我有一个名为register的类,所以每当创建一个新的寄存器时,就会向用户触发一个邮件,这是构造函数的一个参数。

几天之后,每当创建邮件时都会有新的子邮件发送给用户,并且应该发送数据库条目。

子寄存器继承了寄存器,在其构造函数中我们调用了super(user),然后进行了方法调用以进行db条目。

这是你如何堆叠它。可以有不同的父构造函数,或者甚至可以使用super。

调用父方法

java中没有任何东西没有理由,即使有,也不会有那么久。

答案 5 :(得分:0)

Java支持Inheritance功能,super()关键字描述超类的默认构造函数。每当从超类扩展子类时,也可以使用super(Params... params)。 OOP在概念上需要继承类以保持交互关系更加精确。