Java中类的数据成员的初始化顺序
对于单一类:
属性初始化 ---> 按顺序执行静态初始化块(只能操作静态属性)
---> 按顺序执行初始化块 ---> 构造方法
对于存在继承关系的类:
父类属性初始化 ---> 按顺序执行父类静态初始化块 ---> 按顺序执行子类初始化块
---> 按顺序执行父类普通初始化块 ---> 父类构造方法
---> 按顺序执行子类普通初始化块 ---> 子类构造方法
要点1:对于静态初始化块,无论声明多少次对象,只会执行一次
要点2:在主函数之前,会优先桉顺序执行所在类(代码中的Test类)的静态初始化块,之后才执行主函数的内容
参考代码:
以下是包含main函数的Test类
package com.hao;
class Test{
//数据成员
static int a = 1;
//普通初始化块1
{
System.out.println("Test类普通初始化块1");
}
//静态初始化块1
static{
System.out.println("Test类静态初始化块1");
}
//普通初始化块2
{
System.out.println("Test类普通初始化块2");
}
//构造方法
Test(){
System.out.println("Test类构造方法");
}
//普通初始化块3
{
System.out.println("Test类普通初始化块3");
}
//静态初始化块2
static{
System.out.println("Test类静态初始化块2");
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
//在主函数之前,会优先桉顺序执行所在类的静态初始化块,之后才执行主函数的内容
System.out.println("Hello,World");
Animal a = new Dog();
Animal b = new Dog();
// Test a = new Test();
// Test b = new Test();
}
}//Test
以下是父类Animal的代码内容:
package com.hao;
public class Animal {
static int a = 11;
/*
* 可观察得到a的变化情况为 11 14 16 13 15 12
*/
//父类构造方法
Animal(){
System.out.println("父类构造方法");
System.out.printf("%d ---> ", a);
a = 12;
System.out.println(a);
}
//父类普通初始化块1
{
System.out.println("父类普通初始化块1:");
System.out.printf("%d ---> ", a);
a = 13;
System.out.println(a);
}
//父类静态初始化块1
static{
System.out.println("父类静态初始化块1");
System.out.printf("%d ---> ", a);
a = 14;
System.out.println(a);
}
//父类普通初始化快2
{
System.out.println("父类普通初始化块2");
System.out.printf("%d ---> ", a);
a = 15;
System.out.println(a);
}
//父类静态初始化块2
static{
System.out.println("父类静态初始化块2");
System.out.printf("%d ---> ", a);
a = 16;
System.out.println(a);
}
}//Animal
以下是子类Dog的代码内容:
package com.hao;
public class Dog extends Animal {
//子类中的a变化顺序为 12->23->25->22->24->21
//子类构造方法
Dog(){
System.out.println("子类构造方法");
System.out.printf("%d ---> ", a);
a = 21;
System.out.println(a);
}
//子类普通初始化块1
{
System.out.println("子类普通初始化块1");
System.out.printf("%d ---> ", a);
a = 22;
System.out.println(a);
}
//子类静态初始化块1
static{
System.out.println("子类静态初始化块1");
System.out.printf("%d ---> ", a);
a = 23;
System.out.println(a);
}
//子类普通初始化块2
{
System.out.println("子类普通初始化块2");
System.out.printf("%d ---> ", a);
a = 24;
System.out.println(a);
}
//子类静态初始化块2
static{
System.out.println("子类静态初始化块2");
System.out.printf("%d ---> ", a);
a = 25;
System.out.println(a);
}
}
上述代码a的值的变化顺序依次为 11 14 16 23 25 13 15 12 22 24 21 (这里开始是第二个对象的了) 13 15 12 22 24 21
Java中类的数据成员的初始化顺序的更多相关文章
- Java 类成员的初始化顺序
Java 类成员的初始化顺序 前言:开发中碰到一个Java文件中有很多的成员变量,包括静态和非静态的,还有很多的初始化方法,很好奇这些成员的初始化顺序,在这里作个研究. 1 无继承情况下的Jav ...
- java类中成员的初始化顺序(一)
类被创建之后的成员的初始化顺序到底是怎么样的? 首先 不考虑继承 package com; public class DemoOne { /** * 关于类的初始化顺序 */ //不考虑继承结构的情况 ...
- Java语法专题2: 类变量的初始化顺序
合集目录 Java语法专题2: 类变量的初始化顺序 问题 这也是Java面试中出镜率很高的基础概念问题 描述一下多级继承中字段初始化顺序 描述一下多级继承中类变量初始化顺序 写出运行以下代码时的控制台 ...
- Java中类成员变量初始化顺序
一. 定义处默认初始化vs构造函数中初始化 java中类成员变量支持在声明处初始化,也可以在构造函数中初始化,那么这两者有什么区别呢?看下面例子 public class FieldsInit { p ...
- Java类继承关系中的初始化顺序
Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释. 非继承关系中的初始化顺序 对于非继承关系,主类Ini ...
- 【java虚拟机系列】java中类与对象的加载顺序
首先了解一下Java虚拟机初始化的原理. JVM通过加装.连接和初始化一个Java类型,使该类型可以被正在运行的Java程序所使用.类型的生命周期如下图所示: 装载和连接必须在初始化之前就要完成. 类 ...
- C++中默认构造函数中数据成员的初始化
构造函数的任务是初始化数据成员的,在类中,如果没有显示定义任何构造函数,编译器将为我们创建一个构造函数,称为合成的默认构造函数,合成的默认构造函数使用与变量初始化相同的规则来初始化成员.即当类中的数据 ...
- java类的加载以及初始化顺序
类的加载和初始化的了解对于我们对编程的理解有很大帮助,最近在看类的记载方面的问题.从网上查阅了若干文章,现总结如下: 我们通过一段代码来了解类加载和初始化的顺序: package com.classl ...
- C++成员变量初始化顺序问题
由于面试题中,考官出了一道简单的程序输出结果值的题:如下, class A { private: int n1; int n2; public: A():n2(0),n1(n2+2){} void P ...
随机推荐
- android-oldman之TitleBar
随着大众口味的不断提高,对app要的开发的要求也不断提高,开发人员们要在app上展示的东西安也越来越多,android早期的一些控件慢慢的不不能满足开发的要求了,比如TitleBar的应用的就没有原来 ...
- AngularJs的UI组件ui-Bootstrap分享(六)——Tabs
tabs控件使用uib-tabset指令和uib-tab指令,效果是这样的: <!DOCTYPE html> <html ng-app="ui.bootstrap.demo ...
- SoapUI中如何获取当前active环境
// Get the current selected Environment def activeEnv = testRunner.testCase.testSuite.project.getAct ...
- HBase查找一条数据的过程
HBase中的Client如何路由到正确的RegionServer 在HBase中,大部分的操作都是在RegionServer完成的,Client端想要插入,删除,查询数据都需要先找到相应的 Regi ...
- logistc regression练习(三)
% Exercise 4 -- Logistic Regression clear all; close all; clc x = load('E:\workstation\data\ex4x.dat ...
- EasyUI使用JSON保存数据
目前来说,使用JSON保存数据比较方便,前台可以不用Test.aspx 页面,可以直接用Html页面,使用.aspx页面的弊端就不在这里熬述. 具体步骤如下: 1.新建一个Html页面,命名为Test ...
- 第一章 Android系统移植与驱动开发概述
本书第一章首先简单概要地介绍了关于Android系统移植和驱动开发的相关内容. 所谓“移植”是指为特定的自己的设备,如手机定制Android的过程.自己开发一些程序(移植)装载在设备上,使得Andro ...
- jQuery从无知到无所不知
说明: 本文以读书笔记的方式整理jQuery的重要知识点,言简意赅,一语中的,删繁就简,引人入胜. 本文先对jQuery强大的功能作一系统的介绍,再详细整理jQuery的选择器.过滤器.DOM操作.事 ...
- 纯CSS 箭头流程,网上找的,留着备用
无意之中看到一个纯CSS做的箭头导航(流程式),收藏一下,以备不时之需 实际效果 步骤一 步骤二 步骤三 步骤四 源代码: HTML: <div class="wrapper" ...
- 第三次作业——for 语句及分支结构else-if
1.本次学习到的知识点: (1)else-if的一般形式:if(表达式1)语句1:else if(表达式2)语句2:........else if(表达式n-1)语句n-1:else语句n: (2)遇 ...