java - Java中如何避免隐式调用父类的构造函数?

标签 java ruby

我有这段代码,它打印 "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 的接触很少,所以我很自然地倾向于将 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

最佳答案

避免隐式调用父构造函数的唯一方法是显式调用父构造函数。您无法避免为每个类调用构造函数。

顺便说一句,您不需要将名称存储两次。更简单的方法是执行以下操作。

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 中,假设没有合理的理由不调用给定类的构造函数。如果您发现这是一个问题,也许您正在构造函数中执行的操作不仅仅是构造,而且会产生不良副作用。

对象构造应该只是初始化对象。应避免副作用。

关于java - Java中如何避免隐式调用父类的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23266223/

相关文章:

java - stringName.next() 接受用户的输入,但 stringName.nextLine() 不接受。有什么不同? ( java )

java - 如何获取具有多个泛型类型的类型来匹配类型参数?

java - Java Card 中小程序的坚固性

ruby - 为什么 Ruby 的 splat 在组合数组时比使用 + 组合数组慢?

java - 无法获得可比较的接口(interface)工作

java - JScrollPane - 内容和滚动条未呈现

ruby - 如何保存neo4j数据库?

jquery_ujs 问题 : Font Awesome animated spinner works in Chrome but Not Safari

ruby-on-rails - 尝试创建新的 Rails 应用程序时出现 Thor 参数错误

ruby - 无法获取 &lt;input&gt; 元素引起的标签文本