Java构造函数内部的多态行为可能带来的问题
来源:互联网 发布:在乎山水之间的乎 编辑:程序博客网 时间:2024/06/06 03:22
《Thinking in Java》
Java构造函数的初始化顺序
在所有事情发生之前,将该类以及其基类的所有对象分配的存储空间初始化为二进制的零。比如int类型会分配为0,对象会被初始化为null。
调用基类的构造方法,并且不断递归下去。也就是必须先调用最上层的基类的构造方法,直到最底层的导出类
按照声明的顺序,调用成员变量的初始化方法。一般成员变量都会声明在类的前面,在调用构造函数的主体之前,会先对这些变量初始化赋值。
调用导出类的构造方法的主体
Java构造函数的初始化顺序看起来没有什么大问题,不过在一些特殊的情况下,还是有可能会出现错误的。比如下面的类:
public class Main{ public static void main(String[] args){ new Child(5); }}class Parent{ public Parent(){ System.out.println("Build parent before"); printValue(); System.out.println("After parent before"); } public void printValue(){ System.out.println("Parent printValue"); }}class Child extends Parent{ private int value=1; public Child(int value){ this.value=value; } public void printValue(){ System.out.println("Child printValue: value="+value); }}
输出结果
Build parent beforeChild printValue: value=0After parent before
可以看到,由于在导出类的基类的构造函数中调用了多态方法printValue(),这个方法在对象被完全初始化之前就调用了,也就是基类的构造方法调用了导出类的方法,而这个方法所使用的成员变量在导出类中可能还没有被初始化,因此会出现一些可怕的错误。比如在这个例子中,输出的是int的系统初始化值0
从上面的例子我们可以看出,由于多态机制的存在,在构造函数中使用多态方法可能会导致难以察觉的错误,因此我们要尽量避免在构造函数中调用其它方法,如果无法避免,也应该用那些在基类中属于final或者private类型的方法。
1 0
- Java构造函数内部的多态行为可能带来的问题
- java,构造函数内部的多态行为
- JAVA构造器内部的多态方法的行为
- Java构造器内部的多态方法的行为
- java 构造器内部的多态方法和行为
- Java知识点笔记--构造器内部的多态行为
- 构造器内部的多态行为
- 主题:构造方法内部的多态方法的行为
- 构造器内部的多态方法的行为
- 构造器内部的多态方法的行为
- 构造器内部的多态方法的行为
- 构造器内部的多态方法的行为
- 构造器内部的多态方法的行为
- 构造器内部的多态方法的行为
- 构造器内部的多态方法的行为
- java学习之构造器内部的多态方法的行为
- Java中构造器内部的多态方法的行为
- 构造器内部的多态方法行为
- 获取sql serverl数据库第10到20条数据
- ES6 let和const详解及使用细节
- 07_数据绑定
- PTA——宿舍谁最高
- tensorflow张量详解
- Java构造函数内部的多态行为可能带来的问题
- Unity&网络--HLAPI(2):Unity HLAPI NetworkManager与玩家NetworkBehaviour的各回调函数的调用时间序列
- 笔记4-JAVA的初学浅识(Java 对象和类)
- 基于对评论进行分类的持续运行模型
- maven多模块管理jetty插件运行
- HAWQ技术解析(十六) —— 运维监控
- 基于JFreeChart的javaweb图表绘制(接上文)
- Swift3数组访问
- 异步上传文件并获得返回值(完全跨域)