我们知道可以从子类的构造函数中调用父类的构造函数。它可以通过调用super来完成,super应该是构造函数的第一个语句。
它是否只是为了增加OOP概念的功能或者有任何实际应用而保留的功能?
如果有任何实际应用,请说明。
我要求实际应用。这意味着一个现实生活场景,使用此功能非常有用,而不是以其他方式完成工作。
每个人都只是发布概念或代码如何工作。但我已经知道了。我只想要一个实际的场景,它可以让我免于编写大量代码或者不可能做其他代码。
答案 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;
}
}
请注意Circle
和Rectangle
如何与Positionable
的构造函数共享逻辑,而不是自己设置x
和y
(必须如果不支持来自构造函数的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在概念上需要继承类以保持交互关系更加精确。