子类与父类构造器的思考

看到一道题,有所思考:

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

详情参见Java文档

至于b.method()方法进入A类执行,我认为是子类继承父类,共享一块内存吧,所以进入A类执行其实也是在B类中执行。

一点拙见,希望多多指点。共同进步 。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值