拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
执行顺序是这样的:
1. super(); 1.1. super.i = 7; 1.2. this.setI(20) => this.i = 60; 1.3. System.out.println("i from a is " + super.i) => 7; 2. this(); 2.1. this.i = 10; 2.2. System.out.println("i from b is " + this.i) => 10;
A.i 和 B.i 都是package-private的, B.i 没有Override A.i, 这两者是独立的;
A.i
B.i
A.setI 和 B.setI 都是public, B.setI Override A.setI, A在构造时调用的是B.setI;
A.setI
B.setI
B在构造函数之外的成员初始化是在super()之后执行的, B.i先是在super里被B.setI设为60, 再被B的成员初始化设为10;
super()
删除B中的int i = 10;之后, 如果A和B处于同一个package, B.setI访问的就是A.i, super()时A.i被设为60之后就不会有变更, 两次打印都是60
int i = 10;
在子类中再声明一个父类中已有的成员,不会报错吗?至少也应该是警告吧。
我只能说,题目出得太缺德了。实际开发中不可能这么写,自己给自己挖坑啊。
7.101.到A的构造方法,执行完Object的空参构造。2.int I=73.setI(20)调用的是子类的setI() 此时子类的I为60,父类的仍为7.4.打印this.i 此时在父类中.是 7;(注意点:变量看实际调用者, this是当前父类;方法因为被重写,调用子类)5.int I=10 覆盖了原先的60.6,打印this.i 此时为10.
60.60注意:你删除了子类的I,默认调用的就是父类的I3.调用子类setI,赋值给了父类,此时父类改变为60.5.此时没有覆盖,this.i 默认调用父类继承下来的I. 为60.
论Degbug的重要性...
执行顺序是这样的:
A.i
和B.i
都是package-private的,B.i
没有OverrideA.i
, 这两者是独立的;A.setI
和B.setI
都是public,B.setI
OverrideA.setI
, A在构造时调用的是B.setI
;B在构造函数之外的成员初始化是在
super()
之后执行的,B.i
先是在super里被B.setI
设为60, 再被B的成员初始化设为10;删除B中的
int i = 10;
之后, 如果A和B处于同一个package,B.setI
访问的就是A.i
, super()时A.i被设为60之后就不会有变更, 两次打印都是60在子类中再声明一个父类中已有的成员,不会报错吗?至少也应该是警告吧。
我只能说,题目出得太缺德了。实际开发中不可能这么写,自己给自己挖坑啊。
7.10
1.到A的构造方法,执行完Object的空参构造。
2.int I=7
3.setI(20)调用的是子类的setI() 此时子类的I为60,父类的仍为7.
4.打印this.i 此时在父类中.是 7;(注意点:变量看实际调用者, this是当前父类;方法因为被重写,调用子类)
5.int I=10 覆盖了原先的60.
6,打印this.i 此时为10.
60.60
注意:你删除了子类的I,默认调用的就是父类的I
3.调用子类setI,赋值给了父类,此时父类改变为60.
5.此时没有覆盖,this.i 默认调用父类继承下来的I. 为60.
论Degbug的重要性...