Java的初始化过程
在刷题的过程中,时常会碰到关于Java中的类的初始化顺序的问题。
总结如下,便于以后复习:
初始化过程:
- 首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化;
- 然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化;
- 其次,初始化父类的普通成员变量和代码块,再执行父类的构造方法;
- 最后,初始化子类的普通成员变量和代码块,再执行子类的构造方法;
举例如下:
class C {
C() {
System.out.print("C");
}
}
class A {
C c = new C();
A() {
this("A");
System.out.print("A");
}
A(String s) {
System.out.print(s);
}
}
class Test extends A {
Test() {
super("B");
System.out.print("B");
}
public static void main(String[] args) {
new Test();
}
}
在上面的程序中,new了一个新类Test后,其初始化过程如下:
- 调用构造方法来初始化该子对象,但是因为Test继承自类A,所以需要先调用A的构造方法;
- 在Test的构造方法中通过super("B") 显式调用了父类的带参构造方法,将不再调用其无参构造方法;
- 再执行A的构造方法之前,需要先对其成员变量进行初始化,因此会执行C的构造方法。
- 由此可知,最终的调用顺序为:类C的无参构造——>类A的带参构造——>类Test的构造方法的其余部分。
因此最后输出的结果为:
CBB
Java的初始化过程的更多相关文章
- TODO: Java虚拟机 初始化过程
Java虚拟机 初始化过程: 参考: https://www.cnblogs.com/bhlsheji/p/4017816.html 参考:https://blog.csdn.net/boling_c ...
- AJPFX总结Java 程序初始化过程
觉得Core Java在Java 初始化过程的总体顺序没有讲,只是说了构造器时的顺序,作者似乎认为路径很多,列出来比较混乱.我觉得还是要搞清楚它的过程比较好.所以现在结合我的学习经验写出具体过程: 过 ...
- 综合: Java 对象初始化过程
class Fu { Fu() { show(); } void show() { System.out.println("xixi"); } } class Zi extends ...
- 【Java】初始化过程
以下程序执行的结果是: class X{ Y y=new Y(); public X(){ System.out.print("X"); } } class Y{ public Y ...
- Java 子类初始化过程
//父类 class Animal{ private String name; private int age; Animal(String name, int age) {//创建父类构造器 sup ...
- Java类变量和成员变量初始化过程
一.类的初始化 对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量. 类的编译决定了类的初始化过程. 编译器生成的class文件主要对定义在源文件中的类进行了如下的更改: ...
- java代码的初始化过程研究
刚刚在ITeye上看到一篇关于java代码初始化的文章,看到代码我试着推理了下结果,虽然是大学时代学的知识了,没想到还能做对.(看来自己大学时掌握的基础还算不错,(*^__^*) 嘻嘻……)但 ...
- java中对象产生初始化过程
以前面试的时候,很多公司的笔试题中有关new一个对象有关一系列初始化的过程的选择题目.请看下面的题目. class Parent { static { System.out.println(" ...
- 解析Java类和对象的初始化过程
类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,Google 了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和 JVM 层次来 ...
随机推荐
- try catch中的return与finally
try catch中的return与finally 代码为 public class Test{ public int add(int a,int b){ try { return a+b; } ca ...
- Servlet和Servlet容器
Java Servlet(Java服务器小程序)是一个基于Java技术的Web组件,运行在服务器端,它由Servlet容器所管理,用于生成动态的内容, Servlet是平台独立的Java类,编写一个S ...
- 舌头算法的C++实现
观察生活,我们不难发现,吃饭的时候,有时候左边的东西会到右边来,这是为什么呢?就是舌头的作用了. 下面的代码将模拟舌头的运动: #include <iostream> #include & ...
- 2021年1月-第02阶段-前端基础-HTML+CSS进阶-VS Code 软件
软件安装 VSCode软件 能够安装 VS Code 能够熟练使用 VS Code 软件 能够安装 VS Code 最常用的插件 1. VS Code简介 1.1 VS Code 简介 Visual ...
- CentOS 用户与群组
目录 1.用户管理 1.1.切换用户 1.2.添加用户 1.3.删除用户 1.4.修改用户 2.群组管理 2.1.查看群组 2.2.添加群组 2.3.删除群组 2.4.修改群组 1.用户管理 Linu ...
- Git浅析
Git浅析 索引 Git的常用命令 GitHub的使用 Git版本创建和回退 Git的工作区和暂存区 Git分支管理 1-Git的常用命令 01.创建一个版本库--进入相应的目录 git init 可 ...
- 阿里大神favoorr提供的书单
Thoughtwoks中国的推荐书单 <http://www.douban.com/doulist/2012097/ >新浪微博-秦迪 <http://blog.2baxb.me/ ...
- spring cloud feign的基本使用
在上一节,我们学会了如何使用ribbon进行来进行服务之间的调用,但是那种需要通过RestTemplate来进行调用而且当参数比较多时,使用起来就比较麻烦.那么有没有一种调用远程方法(别的服务)就像调 ...
- Noip模拟46 2021.8.23
给了签到题,但除了签到题其他的什么也不会.... T1 数数 人均$AC$,没什么好说的,就是排个序,然后双指针交换着往中间移 1 #include<bits/stdc++.h> 2 #d ...
- Python课程笔记(四)
1.模块的导入 相当于Java的包或C语言的头文件 (1) import math s = math.sqrt(25) print(s) (2) from math import sqrt s=mat ...