java类中声明的立即赋值的成员变量,真的立即赋值了吗?
来源:互联网 发布:性价比高的红酒 知乎 编辑:程序博客网 时间:2024/06/04 18:42
java类中声明的立即赋值的成员变量,真的立即赋值了吗?
我告诉你答案。并没有!
下面我们来执行一个例子,验证一下?
首先定义一个抽象的父类,父类的构造函数中调用子类实现的方法。
public abstract class Parent {public Parent(){System.out.println("在父类的构造函数中调动子类的实例化了initVariables方法,输出的值是");initVariables();}protected abstract void initVariables();}
再定义一个子类。
public class Son extends Parent{private int number=6;public Son(){super();System.out.println("在子类的构造函数中,在super下面执行initVariables方法,输出的值是");initVariables();}@Overrideprotected void initVariables() {System.out.println("number is "+number);}}
好,下面就来实例化一个子类对象看看输出吧!
public class Main {public static void main(String[] args) {Son son = new Son();}}
输出的内容是:
在父类的构造函数中调动子类的实例化了initVariables方法,输出的值是number is 0在子类的构造函数中,在super下面执行initVariables方法,输出的值是number is 6
为什么在父类构造函数中调用子类的initVariables方法输出number的值是0呢?我明明在声明number的时候就是赋值为6了的啊(privateintnumber=6;)。但是在子类的构造函数中调用initVariables方法确实输出正常呢?实在是百思不得其解。
没有其他办法了?看来只能调试,一步一步看程序是怎么进行的。
1.定义Son对象,首先进入Son构造函数
2.调用了super,所以进入父类构造函数
3.父类调用了子类的initVariables方法,此时number为0
4.父类构造函数执行完了,按理说应该是回到子类执行super下面的initVariables方法的啊,但是程序是执行声明和赋值的成员变量的那里privateintnumber=6;当执行完成员变量赋值后才回到super后面的initVariables方法。这时候输出就是number=6了。
看到这里大家应该懂了。对于类中的成员变量,一般的数据类型,声明成员变量之后就有一个默认值,比如privateintnumber;其实这个number就是等于0了的。java虚拟机会默认给他一个值,对于其他的对象就是默认值为null.
为什么要说这个问题呢?因为之前我在做一些程序的时候,就是在父类构造函数中调用子类实现的抽象方法,而在这个方法中又使用到了子类的成员变量(这些变量是在声明的时候就赋值了的),然后执行程序,发现怎么都不是我想要的东西。原来是这些变量其实在父类构造函数中调用的方法时还没有真正的赋值。
希望对大家有帮助!
- java类中声明的立即赋值的成员变量,真的立即赋值了吗?
- Java中的类,成员变量的值,在声明的时候直接赋值与在构造函数中再赋值,这个是无所谓的,还是有什么规矩?
- JavaScript中变量的声明和赋值
- 关于为什么类的静态成员变量不能立即初始化
- 关于为什么类的静态成员变量不能立即初始化
- 关于为什么类的静态成员变量不能立即初始化 .
- 关于为什么类的静态成员变量不能立即初始化
- java成员变量在什么时候赋值的?
- java成员变量在什么时候赋值的?
- 变量的声明与赋值
- 类成员变量的赋值与初始化
- C++ 类中const成员变量的赋值
- c++ 类中const成员变量的赋值
- c++ 类中const成员变量的赋值
- c++ 类中const成员变量的赋值
- c++ 类中const成员变量的赋值
- Java类中的成员变量的赋值方法
- java调用OutputStream接口中flush方法,真的会立即刷新吗?
- Session中放错误提示JSP上获取
- LintCode : 单词搜索 II
- android委托模式----事件处理
- 总结一下最近的学习状态
- 计算机相关专业
- java类中声明的立即赋值的成员变量,真的立即赋值了吗?
- 离散数学——树
- 文件上传之Apache commons fileupload使用
- 重定向和请求转发的区别
- 输出蛇形代码
- 五、账户权限修改
- 反射使用全解析
- 使用IDEA和Mybatis实现CRUD(一)
- nodejs 通过ffmpeg,实现微信jsapi上传mp3录音