Java类的初始化顺序
做Java开发的,起码要知道类的初始化顺序,因为这样你才知道编写的代码运行到了那里。
一段代码
public class BaseTest {
private String baseName = "baseName";
static {
System.out.println("父类静态代码块");
}
public BaseTest() {
System.out.println("父类构造方法");
callName();
}
public void callName(){
System.out.println(baseName);
}
static class Sub extends BaseTest{
private String baseName = "subName";
public Sub() {
System.out.println("子类构造方法");
}
static {
System.out.println("子类静态代码块");
}
@Override
public void callName() {
System.out.println(baseName); //输出为null
super.callName(); //输出baseName,baseStatic
}
}
public static void main(String[] args) {
Sub sub = new Sub();
}
}
以上代码运行的结果如下:
父类静态代码块
子类静态代码块
父类构造方法
null
baseName
子类构造方法
为什么在子类中直接调用 System.out.println(baseName),输出为null呢?
在创造派生类的过程中首先创建基类对象,然后才能创建派生类。创建基类即默认调用BaseTest()方法,在方法中调用callName()方法,由于派生类中存在此方法,则被调用的callName()方法是派生类中的方法,此时派生类还未构造,所以变量baseName的值为null
静态代码块的初始化
public class StaticTest {
static {
System.out.println("父类的静态代码块");
}
public static String str = getStr();
private static String getStr() {
System.out.println("父类的静态方法");
return "str1";
}
public StaticTest() {
System.out.println("父类构造方法");
}
static class SubStatic extends StaticTest{
static {
System.out.println("子类的静态代码块");
}
public static String str1 = getStr1();
private static String getStr1() {
System.out.println("子类的静态方法");
return "str1";
}
public SubStatic() {
System.out.println("子类构造方法");
}
}
public static void main(String[] args) {
new SubStatic();
}
}
运行结果:
父类的静态代码块
父类的静态方法
子类的静态代码块
子类的静态方法
父类构造方法
子类构造方法
最后
动手操作,查看了下类的初始化过程。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
面试准备
想去名企锻炼自己的技术本领,梳理一下技术的要求,做好准备,希望能达成自己的目标。 Java基础扎实,理解IO,多线程,集合等基础框架,对JVM有一定的了解。 前天一位Java大牛告诉我,刚毕业一年最好还是准备基础,刚毕业一年没有大型的项目经验,基础就要足够的耐问。 对使用的开源框架,能了解到他的原理和机制,对Spring,Mybatis等开源框架熟悉。 Spring,Mybatis系列的开源框架,研读源码...一定要能说自己精通Spring,Mybatis。做到如此才有希望。 熟悉分布式系统的设计和应用,熟悉分布式,缓存,消息等机制,能对分布式常用技术进行合理应用解决问题。 分布式的毕竟也做过一些,但要有自己的思考... 熟悉Linux操作系统,和大型数据库(Oracle,MySQL),对常见的NoSQL(Redis,MongoDB,HBase,Memcached)有一点研究。 追求并尝试最新的技术,追求编码的优雅,从技术趋势和思路上能影响团队,学习能力好,适应能力强,具备耐心,细心的品质。 刷名企Offer这本书,熟悉Tcp/ip协议,数据结构和算法。 最后 我能准备的差不多就以上的...
-
下一篇
C++程序设计基础(5)sizeof的使用
1.知识点 (1)sizeof是一个单目运算发,而不是一个函数,其用于获取操作数所占内存空间的字节数。 (2)sizeof的操作数可以使类型名,也可以是表达式,如果是类型名则直接获得该类型所占字节数,如果是表达式,则先分析表达式结果的类型,再根据类型确定所占字节数,并不对表达式进行实际计算。 1 int a = 1; 2 double b = 1.5; 3 sizeof(int);//结果为4 4 sizeof(a); //结果为4 5 sizeof(b); //结果为8 (3)sizeof很少单独使用,而是和内存分配或者计算法数组长度等需求进行配合使用。 1 //与内存空间分配配合使用 2 int *ptr = (int *)malloc(sizeof(int) * 20); 3 //与计算数组长度配合使用 4 int count = sizeof(darray) / sizeof(double); (4)数组名作为操作数时,将获得整个数组所占空间,当数组名作为实参传递给子函数时,此时数组名已经成为了指针,其计算结果将是指针的所占空间。 void subfunc(double dar...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7,8上快速安装Gitea,搭建Git服务器