在Java

时间:2016-01-30 07:04:01

标签: java inheritance constructor

在java中,类中的构造函数可以调用它的重载构造函数 超类(如果我们想明确地进行调用,那么 故意)。

我知道类中的构造函数会进行隐式调用 no-arg超类的默认构造函数(带super();)。但是假设我 调用一个重载的超类构造函数(比如super(String s);),然后我的问题是,这可能吗?如果这是可能的话,那么 是super()之前仍然在super(String s)之前发出的号召是什么 它的含义是什么?

2 个答案:

答案 0 :(得分:3)

是的,您可以调用超类的重载构造函数。这应该是构造函数中的第一个语句。

不,你只能调用一次超类的构造函数,因此对super(args)的调用会将隐式调用替换为super()。例如:

A.java

public class A {
    private String fieldA;

    public A(String a) {
        fieldA = a;
    }
}

B.java

public class B extends A {
    private int fieldB;

    public B(String a, int b) {
        // Call the overloaded constructor of the class A
        super(a); // replaces the implicit call to super()
        fieldB = b;
    }
}

但如果你这样做,你会收到一个错误,因为对super()的调用不是构造函数的第一个语句:

public B(String a, int b) {
    fieldB = b;
    super(a); // Call to super() must be first statement in constructor body
}

答案 1 :(得分:0)

  

是的,我们可以覆盖超类的构造函数调用,同时覆盖   超类的默认构造函数调用它不会跳过/避免调用   默认构造函数调用。

请参阅此代码,并查看输出

$(function() {
  $('.scale').hover(function() {
    var $previous = $(this);
    while ($previous.length && $previous.hasClass('scale')) {
      $previous.css('background-color', 'yellow');
      $previous = $previous.prev();
    }
  }, function() {
    var $previous = $(this);
    while ($previous.length && $previous.hasClass('scale')) {
      $previous.css('background-color', '');
      $previous = $previous.prev();
    }
  })
});