构造函数和抽象类中的java调用方法?

时间:2016-10-12 02:27:08

标签: java constructor

public class NewSeqTest {
  public static void main(String[] args) {
    new S();
    new Derived(100);
  }
}


class P {
  String s = "parent";
  public P() {
    test();
  }
  public void test() { //test 1
    System.out.println(s + "  parent");
  }
}

class S extends P {
  String s = "son";
  public S() {
    test();
  }
  @Override
  public void test() { //test 2
    System.out.println(s + "  son");
  }
}

abstract class Base {
  public Base() {
    print();
  }
  abstract public void print();
}

class Derived extends Base {
  private int x = 3;
  public Derived(int x) {
    this.x = x;
  }
  @Override
  public void print() {
    System.out.println(x);
  }
}

//输出

     null  son

     son  son

     0

我的问题是 1.为什么P构造函数打印" null son&#34 ;;我认为是" null parent" ?

2为什么抽象类Base可以在构造函数中执行抽象方法print()?

对不起代码格式,我不知道如何正确使用它。

2 个答案:

答案 0 :(得分:2)

  1. 您已经覆盖了子类test中的方法S,并且您正在构建类型为S的对象。因此,在超类构造函数中,当调用test()时,它会从子类test()调用覆盖版本的S。这是压倒一切的重点。

  2. 与1.相同1.方法print中的方法{em> 抽象类Derived,而您正在Derived的实例中构建,而不是Base。 (由于你提到的原因,你说new Base()是不合法的:你不能调用抽象方法)

答案 1 :(得分:0)

  1. 执行new S();会导致P构造函数运行test()。它执行test()中被覆盖的S,其中s打印s。它使用S中的S尚未初始化,因为P的构造函数是在print()的构造函数之后执行的。
    2.同样的答案1.已执行重写x$cordovaFile.copyFile(cordova.file.applicationDirectory + 'www/', "test.db", cordova.file.dataDirectory, "test.db") .then(function (success) { console.log('success'); db = $cordovaSQLite.openDB({ name: "test.db"}); }, function (error) { console.log('error file transfer : ', error); }); 尚未初始化。

  2. 顺便说一句:尝试使用调试器并逐步运行程序以遵循执行路径。