看到一道题,有所思考:
package subclassConstructor;
public class Test_Constructor {
public static void main(String[] args){
System.out.println(new B().getValue());
}
static class A{
protected int value;
public A(int v){
setValue(v);
}
public void setValue(int value){
this.value=value;
}
public int getValue(){
try{
value++;
return value;
}
catch(Exception e){
System.out.println(e.toString());
}
finally{
this.setValue(value);
System.out.println(value);
}
return value;
}
}
static class B extends A{
public B(){
super(5);
setValue(getValue()-3);
}
public void setValue(int value){
super.setValue(2*value);
}
}
}
这次的题目主要考察子类构造器与父类构造器的关系以及代码的执行顺序。
程序首先由main()进入。然后执行B的构造方法,但要先调用父类A的构造方法。
进入A构造中的setValue(),A的成员变量value此时变为5,紧接着执行
new B().setValue()。
getValue()方法,接着进行try-catch-finally
value++; value=11;
this.setValue(value); //this指示B类,其为当前类
又执行super.setValue(2*value);
执行A类的setValue(value); value=22
继续执行setValue(value) value=16
new B()执行完,接着new B().getValue()
接着返回值17,setValue()后值为34
所以打印22,34,17
上面的例题是子类与父类拥有相同的方法名,如果子类与父类有相同属性呢?
package subclassConstructor;
public class Test {
public static void main(String[] args) {
/**
* A,B中过的value只是名字相同其余都不相同
*
* 在类中,与超类中的字段具有相同名称的字段隐藏超类的字段,即使它们的类型不同。
*/
B b = new B();
b.method();//此处调用B类中的method()
}
}
class A {
public int value = 1;
public void method() {
System.out.println(value);
}
}
class B extends A {
public int value = 2;
}
输出为:1
在这个Demo中,子类与父类有着相同字段。Class A与Class B中的value没有关系,他们只是有着相同的名字,但是占据了不同的内存空间。所以不是同一个变量。
援引一段话:
在类中,与超类中的字段具有相同名称的字段隐藏超类的字段,即使它们的类型不同。在子类中,超类中的字段不能被其简单名称引用。相反,必须访问该字段super,这将在下一节中介绍。一般来说,我们不建议隐藏字段,因为它使代码难以阅读。–By ORACLE
至于b.method()方法进入A类执行,我认为是子类继承父类,共享一块内存吧,所以进入A类执行其实也是在B类中执行。
一点拙见,希望多多指点。共同进步 。