我有这段代码可以打印"A Tree"
两次,"An Oak Tree"
一次。我猜它会将Tree
类的构造函数隐式地称为class Oak extends Tree
。无论如何,我可以避免调用父母的构造函数吗?
public class App {
public static void main(String[] args) {
Tree p = new Tree();
Oak m = new Oak();
}
}
public class Tree {
protected String name;
public Tree() {
name = "A Tree";
System.out.println(name);
}
}
public class Oak extends Tree {
public String name = "An Oak Tree";
public Oak() {
System.out.println(name);
}
}
我自然倾向于将Java与Ruby进行比较,因为我很少接触它。在Ruby中,父进程的构造函数似乎只在子进程没有时才被调用。所以,我正在努力使我的基础正确。
class C
def initialize
puts "C class"
end
end
class D < C
def initialize
puts "D class"
end
end
# class E does not have its own constructor
class E < C
end
C.new #=> C class
D.new #=> D class
E.new #=> C class
答案 0 :(得分:4)
避免对父构造函数的隐式调用的唯一方法是对父构造函数进行显式调用。你无法避免为每个类调用构造函数。
BTW您不需要存储name
两次。更简单的方法是执行以下操作。
public class Tree {
protected String name;
public Tree() {
this("A Tree");
}
protected Tree(String name) {
this.name = name;
System.out.println(name);
}
}
public class Oak extends Tree {
public Oak() {
super("An Oak Tree");
}
}
在Java中,假设没有合理的理由不为给定的类调用构造函数。如果你发现这是一个问题,也许你在构造函数中做的事情不仅仅是构造而且有不良的副作用。
对象构造应该只是初始化对象。应该避免副作用。