Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免对父类的隐式调用';Java中的构造函数?_Java_Ruby - Fatal编程技术网

如何避免对父类的隐式调用';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中看到完全相同的情况。