如何避免对父类的隐式调用';Java中的构造函数?
我有这个代码,它可以打印两次“一棵树”和一次“一棵橡树”。我猜它正在隐式调用如何避免对父类的隐式调用';Java中的构造函数?,java,ruby,Java,Ruby,我有这个代码,它可以打印两次“一棵树”和一次“一棵橡树”。我猜它正在隐式调用树类的构造函数,因为类扩展了树。不管怎样,我可以避免调用父构造函数吗 public class App { public static void main(String[] args) { Tree p = new Tree(); Oak m = new Oak(); } } public class Tree { protected String name;
树
类的构造函数,因为类扩展了树
。不管怎样,我可以避免调用父构造函数吗
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
C类
def初始化
把“C类”
结束
结束
D类C类
D.新#=>D类
E.new#=>C类
避免隐式调用父构造函数的唯一方法是显式调用父构造函数。不能避免为每个类调用构造函数
顺便说一句,您不需要存储名称
两次。更简单的方法是执行以下操作
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中,假定没有合理的理由不调用给定类的构造函数。如果你发现这是一个问题,也许你在你的构造函数中做的事情不仅仅是构造,而且有不良的副作用
对象构造应该只是初始化对象。应该避免副作用。避免隐式调用父构造函数的唯一方法是显式调用父构造函数。不能避免为每个类调用构造函数 顺便说一句,您不需要存储
名称
两次。更简单的方法是执行以下操作
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中,假定没有合理的理由不调用给定类的构造函数。如果你发现这是一个问题,也许你在你的构造函数中做的事情不仅仅是构造,而且有不良的副作用
对象构造应该只是初始化对象。应该避免副作用。Ruby没有构造函数,只有方法。您所拥有的与您的Java示例完全不同:在您的Java示例中,在Ruby中执行两个构造函数,除非您显式调用
super
,否则这是永远不会发生的。您在Ruby中看到的只是简单的继承。即使Java没有自动调用父构造函数,您在Java中也会看到完全相同的情况。Ruby没有构造函数,只有方法。您所拥有的与您的Java示例完全不同:在您的Java示例中,在Ruby中执行两个构造函数,除非您显式调用super
,否则这是永远不会发生的。您在Ruby中看到的只是简单的继承。即使Java没有自动调用父构造函数,您也会在Java中看到完全相同的情况。