java中父类和子类初始化顺序
顺序
1. 父类中静态成员变量和静态代码块
2. 子类中静态成员变量和静态代码块
3. 父类中普通成员变量和代码块,父类的构造函数
4. 子类中普通成员变量和代码块,子类的构造函数
其中“和”字两端的按照代码先后顺序执行。
举例
先看代码:
Father类
- public class Father {
- public String fStr1 = "father1";
- protected String fStr2 = "father2";
- private String fStr3 = "father3";
- {
- System.out.println("Father common block be called");
- }
- static {
- System.out.println("Father static block be called");
- }
- public Father() {
- System.out.println("Father constructor be called");
- }
- }
首先是Father类,该类有一个默认构造函数,有一个static的代码块,为了方便查看结果,还有一个普通代码块。
Son类
- package com.zhenghuiyan.testorder;
- public class Son extends Father{
- public String SStr1 = "Son1";
- protected String SStr2 = "Son2";
- private String SStr3 = "Son3";
- {
- System.out.println("Son common block be called");
- }
- static {
- System.out.println("Son static block be called");
- }
- public Son() {
- System.out.println("Son constructor be called");
- }
- public static void main(String[] args) {
- new Son();
- System.out.println();
- new Son();
- }
- }
Son类的内容与Father类基本一致,不同在于Son继承自Father。该类有一个main函数,仅为了测试用,不影响结果。
在main函数中实例化Son。
结果为:
- Father static block be called
- Son static block be called
- Father common block be called
- Father constructor be called
- Son common block be called
- Son constructor be called
- Father common block be called
- Father constructor be called
- Son common block be called
- Son constructor be called
总结:
1,在类加载的时候执行父类的static代码块,并且只执行一次(因为类只加载一次);
2,执行子类的static代码块,并且只执行一次(因为类只加载一次);
3,执行父类的类成员初始化,并且是从上往下按出现顺序执行(在debug时可以看出)。
4,执行父类的构造函数;
5,执行子类的类成员初始化,并且是从上往下按出现顺序执行。
6,执行子类的构造函数。
java中父类和子类初始化顺序的更多相关文章
- Java中静态数据的初始化顺序
Java的类中的数据成员中包含有静态成员(static)时,静态数据成员的初始化顺序是怎样的呢? [程序实例1] import java.util.*; import java.lang.*; imp ...
- JAVA 父类与子类初始化顺序问题
main方法-->子类对象的初始化语句(new className()语句)--->子类构造[因为继承的缘故,它先不会执行]--->父类构造[这一步先不会执行]--->父类静态 ...
- Java中父类和子类代码执行顺序
执行顺序:父类静态块-->子类静态块-->父类非静态块-->父类构造方法-->子类非静态块-->子类构造方法 当父类或子类中有多个静态方法时按在代码中的顺序执行 pack ...
- java中父类与子类, 不同的两个类中的因为构造函数由于递归调用导致栈溢出问题
/* 对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中, 并且是按照java源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行 */ impo ...
- java中静态代码块初始化顺序
(一)java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下, ...
- Java笔记 #04# 类的初始化顺序补充
参考java中的类的初始化顺序详解 package org.sample; class Bread { Bread() { System.out.println("Bread()" ...
- 关于java中构造方法、实例初始化、静态初始化执行顺序
在Java笔试中,构造方法.实例初始化.静态初始化执行顺序,是一个经常被考察的知识点. 像下面的这道题(刚刚刷题做到,虽然做对了,但是还是想整理一下) 运行下面的代码,输出的结果是... class ...
- Java静态函数、父类、子类执行顺序
package class_test; /** * 静态函数.父类.子类执行顺序 * @author root * */ public class Test { public static void ...
- Java中父类强制转换为子类的可能
之前徒弟问了一个问题, 在Java中, 父类对象到底能不能转换成对应的子类对象? 到底能不能, 今天就来说说这个问题, 先看下面一段代码: package cn.com.hanbinit.test; ...
随机推荐
- nowcoder106I Neat Tree (单调栈)
Richard神犇出给nowcoder的题 用单调栈找到每个点它向右和向左的第一个大于或小于它的位置,然后它作为最大值/最小值的区间就要在这个范围里,那么它的贡献就是这个区间长度乘一乘再减一减 注意一 ...
- angular的一次小错误
前台页面的错误: 在使用angular的时候,发现了标签等不能解析,忙了一个小时没找见错误在哪,最后才发现,原来ng-app,ng-controller等声明错了地方,声明在了div上,而不是在bod ...
- list对象指针与指针类型list
#include <string> #include <cctype> #include <algorithm> #include <iostream> ...
- Django中Celery http请求异步处理(四)
Django中Celery http请求异步处理 本章延续celery之前的系列 1.settings配置 2.编写task jib_update_task任务为更新salt jid数据 3.url设 ...
- day63_SpringMVC学习笔记_01
1.JAVAEE体系结构 JAVAEE体系结构图如下所示: 2.什么是springmvc? 什么是mvc? Model1 Model2 SpringMVC是什么? SpringMVC是一个web层mv ...
- Selenium学习(Python)
#从Selenium中导入Webdriver类,该类中定义了selenium支持的浏览器 # webdriver.Firefox # webdriver.FirefoxProfile # webdri ...
- HTML5 移动开发 (HTML5标签和属性)
第一阶 1.如何使用HTML5中的新标签及属性 2.HTML5中的其它变化 3.HTML5的移动支持 4.使用HTML5开发移动WEB引用的理由 第二阶 HTML5 ...
- 20155232 2016-2017-3 《Java程序设计》第8周学习总结
20155232 2016-2017-3 <Java程序设计>第8周学习总结 教材学习内容总结 第十四章NIO与NIO2 NIO使用频道来衔接数据结点,在处理数据时,NIO可以让你设定缓冲 ...
- [BZOJ 1879][SDOI 2009]Bill的挑战 题解(状压DP)
[BZOJ 1879][SDOI 2009]Bill的挑战 Description Solution 1.考虑状压的方式. 方案1:如果我们把每一个字符串压起来,用一个布尔数组表示与每一个字母的匹配关 ...
- (F. MST Unification)最小生成树
题目链接:http://codeforces.com/contest/1108/problem/F 题目大意:给你n个点和m条边,然后让你进行一些操作使得这个图的最小生成树唯一,每次的操作是给某一条边 ...