Java 构造时成员初始化的陷阱
1、首先列出代码
Base.java
public class Base
{
Base() {
preProcess();
} void preProcess() {}
}
Derived.java
public class Derived extends Base
{
public String whenAmISet = "set when declared"; @Override void preProcess()
{
whenAmISet = "set in preProcess()";
}
}
Main.java
public class Main
{
public static void main(String[] args)
{
Derived d = new Derived();
System.out.println( d.whenAmISet );
}
}
2、执行结果
3、原因
可參考http://blog.csdn.net/jltxgcy/article/details/17398751。
1、调用父类全局变量初始化,这里没有全局变量也不用初始化。
2、调用父类构造函数,里面调用了子类的成员函数preProcess,whenAmISet被设置为"set in preProcess"。
3、调用子类全局变量初始化,whenAmISet被设置为"set when declared"。
4、调用子类的构造函数。
4、番外
假设全局变量whenAmISet,没有设置初始化值。那么会设置为默认值。
对象为null,int为0。
局部变量。不会设置初始化值。须要显示设置,不能直接使用。
C++构造函数初始化列表必需要显示初始化參数。
和Java不同。
Java 构造时成员初始化的陷阱的更多相关文章
- JAVA构造时成员初始化的陷阱
让我们先来看两个类:Base和Derived类.注意其中的whenAmISet成员变量,和方法preProcess(). 情景1:(子类无构造方法) class Base { Base() { pre ...
- Java中的成员初始化顺序和内存分配过程
Java中的成员初始化顺序和内存分配过程 原帖是这样描述的: http://java.dzone.com/articles/java-object-initialization?utm_source= ...
- java类的成员初始化顺序和初始化块知识
java类的成员初始化顺序和初始化块知识 转自:http://blog.csdn.net/lgfeng218/article/details/7606735 属性.方法.构造方法和自由块都是类中的成员 ...
- Java类的成员初始化顺序
Java类的成员初始化顺序 2017-06-01 代码: public class InitializeSequence { public static void main(String[] args ...
- Java继承时的初始化顺序
Java程序在启动和运行时,需要首先完成初始化的工作.在涉及到继承.static成员变量等因素时,初始化的顺序就复杂起来.下面以一个例子说明继承时的Java初始化顺序. 例子: class Insec ...
- Java 类的成员初始化顺序
做个简单笔录,就当是重温下基础知识. 1.先看代码: package com.test; public class Test { public static void main(String[] ar ...
- java 编译时的初始化顺序
有的时候,java的初始化会对我的工作照成很大影响,所以简单介绍一下, 首先介绍简单的变量的初始化:在类的内部,变量定义的先后顺序决定了初始化的顺序,即使变量定义散布于方法定义之间,它也会先于构造器和 ...
- JAVA构造MAP并初始化MAP
第一种方法:static块初始化 public class Demo{ private static final Map<String, String> myMap; static { m ...
- Java类和对象初始化
类的生命周期: Java类的初始化: 本阶段负责为类变量赋正确的初始值.(类变量即静态变量) Java编译器把所有的类变量初始化语句和静态初始化器通通收集到<clinit>方法中,该方法只 ...
随机推荐
- .Net application,Session,Cache简单比较
Application 对象用于存储和访问来自任何页面的变量,类似于 session 对象.不同之处在于,所有的用户分享一个 Application 对象,而 session 对象和用户的关系是一一对 ...
- [转]Linux下paste命令详解
转自:http://blog.csdn.net/andy572633/article/details/7214126 paste单词意思是粘贴.该命令主要用来将多个文件的内容合并,与cut命令完成的功 ...
- 【原】cocos2d-x开发笔记:获取Sprite上某一个点的透明度,制作不规则按钮
本篇文章主要讲一下怎么做一个不规则的按钮,比如如下图的八卦,点击绿色和点击红色部分,需要执行不同的事件
- node.js安装步骤
首先这是node.js的官网:https://nodejs.org/en/ 截至2017年12月9日,node更新在8.9.3该版本,建议开发人员下载6.0以上版本,8以上不是很稳定! 如果有其他需 ...
- Android HTTP 数据提交
在Android 项目中,使用HTTP协议获取数据或者处理数据,需要使用到多线程和配置相应的APP权限 1.使用线程,使用HTTP 提交数据 private Thread submitThread = ...
- 如何在eclipse中设置断点并调试程序
eclipse导入源码后可以看见代码但并不能调试,(解决方法) 1.eclipse默认的运行环境不是jdk中的jre.将jre换成jdk: 2. 先去掉勾,apply,在打上勾,apply 参考:ht ...
- HDU_1285_拓扑排序(优先队列)
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- iOS 9 中可用的受信任根证书列表
iOS 受信任证书存储区包含随 iOS 预安装的可信根证书. https://support.apple.com/zh-cn/HT205205 关于信任和证书 iOS 9 受信任证书存储区包含三类证 ...
- word-spacing和letter-spacing区别
word-spacing:单词与单词间的间距 letter-spacing:字母与字母间的间距
- js 包管理工具
环境 Windows10 + node 12.x + Webstorm 2019.1.3 工具 npm cnpm yarn npm/cnpm Webstorm 中第一次安装包一定几率卡死,很烦 不使用 ...