子类与父类构造器的思考
来源:互联网 发布:打开windows资源管理器 编辑:程序博客网 时间:2024/06/06 20:39
看到一道题,有所思考:
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类中执行。
一点拙见,希望多多指点。共同进步 。
- 子类与父类构造器的思考
- 子类与父类的构造器
- 父类与子类的构造顺序
- 子类与父类构造器关系
- 父与子类构造器
- 继承(子类与父类构造函数的关系)
- 关于父类与子类的构造函数调用顺序
- 关于Scala子类继承父类属性的问题释疑---子类构造器参数不要与父类属性同名
- java基础---------父类与子类构造器
- 黑马程序员——父类与子类的构造器
- java 子类构造函数与父类构造函数
- 子类构造方法与父类构造方法在调用时的联系
- 注意:父类构造函数与子类构造函数的调用
- Java的子类构造器与其父类关系
- 浅谈java的子类构造器与其父类关系
- 子类重写父类的构造函数
- 子类和父类的构造函数
- 子类,父类构造方法的特点
- TP5的smarty引擎
- ADC与DMA回顾
- Python入门篇(一)
- 使用ES2017的异步函数
- java web api接口调用
- 子类与父类构造器的思考
- 快速排序
- 初识nodejs19
- PHP(Thinkphp框架)将数据表导出csv文件
- `CREATION_DATE` datetime DEFAULT CURRENT_TIMESTAMP报错问题
- ExecutorService的使用
- RecyclerView的GridView和ListView的混排处理
- Pi-3DCAPP正式发布
- cocos creator构建andorid时切换api level编译报错问题解决