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()?
对不起代码格式,我不知道如何正确使用它。
答案 0 :(得分:2)
您已经覆盖了子类test
中的方法S
,并且您正在构建类型为S
的对象。因此,在超类构造函数中,当调用test()
时,它会从子类test()
调用覆盖版本的S
。这是压倒一切的重点。
与1.相同1.方法print
中的方法{em> 抽象类Derived
,而您正在Derived
的实例中构建,而不是Base
。 (由于你提到的原因,你说new Base()
是不合法的:你不能调用抽象方法)
答案 1 :(得分:0)
new S();
会导致P
构造函数运行test()
。它执行test()
中被覆盖的S
,其中s
打印s
。它使用S
中的S
尚未初始化,因为P
的构造函数是在print()
的构造函数之后执行的。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);
});
尚未初始化。
顺便说一句:尝试使用调试器并逐步运行程序以遵循执行路径。