java类中成员的初始化顺序(一)

时间:2023-02-04 12:00:59

类被创建之后的成员的初始化顺序到底是怎么样的?

首先 不考虑继承


package com;

public class DemoOne {
/**
* 关于类的初始化顺序
*/
//不考虑继承结构的情况
private static int a=1;
private String str="我被赋值了";
static{
//为什么static成员函数不能访问非static变量, 不能调用非static成员函数?
//静态代码块独立于对象而存在 不依赖于对象存在 简单来说可以直接以类型名调用DemoOne.a
//而成员变量的存在依赖于对象的创建才能被调用
//所以, static成员不能访问非static变量, 不能调用非static成员!
// 编译报错 System.out.println("str ===="+ str);
System.out.println("1 静态变量被赋初始值 a===="+a);
System.out.println("2 进入静态块");
} {
System.out.println("3 成员变量被赋值 str ===="+ str);
System.out.println("4 进到普通代码块");
}
public void run(){
System.out.println(" 进入普通方法");
}
public static void go(){
System.out.println(" 进入静态方法");
}
    public DemoOne(){
System.out.println("5 进入构造器");
} public static void main(String[] args) {
new DemoOne();
} }
 

运行程序后输出结果为:

1 静态变量被赋初始值 a====1
2 进入静态块
3 成员变量被赋值 str ====我被赋值了
4 进到普通代码块
5 进入构造器

为了验证静态成员的顺序由代码的前后顺序决定 加入第二个静态块

package com;

public class DemoOne {
static{
System.out.println("1 进入第一个静态代码块");
}
private static int a;
static{
System.out.println("2 进入第二个静态块");
}
public static void main(String[] args) {
new DemoOne();
}
}

输出结果为:

1 进入第一个静态代码块
2 进入第二个静态块

由输出结果可以看到 调整顺序后的静态块先后顺序发生改变

总结一下 不考虑继承的类的成员加载顺序依次为 静态变量和常量->顺序位的静态块->普通成员变量->普通代码块->构造器

下面考虑存在父类的情况

package com;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List; public class Demo {
/**
*
* @param args
*/
private static int a=1;
private String str="我在父类被赋值了";
static{
System.out.println("1 父类静态变量被赋初始值 a===="+a);
System.out.println("2 进入父类静态块");
}
{
System.out.println("5 父类成员变量被赋值 str ===="+ str);
System.out.println("6 进入父类普通代码块");
}
public Demo(){
System.out.println("7 进入父类构造器");
}
}

子类

package com;

public class DemoOne  extends Demo{
private static int a=1;
private String str="我在子类被赋值了";
static{
System.out.println("3 子类静态变量被赋初始值 a===="+a);
System.out.println("4 进入子类静态块");
}
{
System.out.println("8 子类成员变量被赋值 str ===="+ str);
System.out.println("9 进入子类普通代码块");
}
public DemoOne(){
System.out.println("10 进入子类构造器");
}
public static void main(String[] args) {
new DemoOne();
} }

输出结果为:

1 父类静态变量被赋初始值 a====1
2 进入父类静态块
3 子类静态变量被赋初始值 a====1
4 进入子类静态块
5 父类成员变量被赋值 str ====我在父类被赋值了
6 进入父类普通代码块
7 进入父类构造器
8 子类成员变量被赋值 str ====我在子类被赋值了
9 进入子类普通代码块
10 进入子类构造器

所以存在父类的情况下 类成员的初始化顺序

父类静态变量->父类静态块->子类静态变量->子类静态块->父类成员变量->父类普通代码块->父类构造器->子类成员变量->子类普通代码块->子类构造器

还在学习总结过程中,如若有误,请看到的朋友及时指出。

java类中成员的初始化顺序(一)的更多相关文章

  1. 浅谈Java类中的变量初始化顺序

    一.变量与构造器的初始化顺序 我们知道一个类中具有类变量.类方法和构造器(方法中的局部变量不讨论,他们是在方法调用时才被初始化),当我们初始化创建一个类对象时,其初始化的顺序为:先初始化类变量,再执行 ...

  2. Java类、实例的初始化顺序

    今晚是阿里巴巴 2013 校园招聘的杭州站笔试.下午匆忙看了两张历年试卷,去现场打了瓶酱油. 题目总体考察点偏基础,倒数第二题(Java 附加题)比较有趣,考察了 Java 初始化机制的细节,在此摘录 ...

  3. Java类中代码的执行顺序 静态代码块>构造代码块>构造方法

    一:静态代码块 注意是代码块,不是静态函数.函数要调用才执行,代码块加载就执行,一般是静态变量的声明与初始化.被static修饰的代码块(赋值.输出操作等).类中静态语句块仅在类加载时被执行一次 如 ...

  4. Java类(继承)初始化顺序

    /** * Created by xfyou on 2016/11/2. * Java继承的初始化 */ public class Beetle extends Insect { int k = pr ...

  5. java类中属性优先执行顺序

    1.父类静态代码块 (  java虚拟机加载类时,就会执行该块代码,故只执行一次) 2 .子类静态代码块 (  java虚拟机加载类时,就会执行该块代码,故只执行一次) 3. 父类属性对象初始化 4. ...

  6. java类中资源加载顺序

    根据优先级别从高到低依次为:1.父类中的静态代码块(static);2.自身的静态代码块;3.父类中的的普通代码块;4.父类的构造方法;5.自身的普通代码块;6.自身的构造方法; 下面是一个测试 结果 ...

  7. java类中成员的划分

  8. Java 类成员的初始化顺序

    Java 类成员的初始化顺序 前言:开发中碰到一个Java文件中有很多的成员变量,包括静态和非静态的,还有很多的初始化方法,很好奇这些成员的初始化顺序,在这里作个研究.   1  无继承情况下的Jav ...

  9. java类的成员初始化顺序和初始化块知识

    java类的成员初始化顺序和初始化块知识 转自:http://blog.csdn.net/lgfeng218/article/details/7606735 属性.方法.构造方法和*块都是类中的成员 ...

随机推荐

  1. Linux C 信号 pause、sigsuspend 的相同与区别

    pause函数:       功能:让进程暂停直到信号出现   #include<unistd.h>      intpause();    函数说明:pause()会令目前的进程暂停(进 ...

  2. Data Validate 之 Data Annotation

    什么是Data Annotation ? 如何使用 ? 自定义Validate Attribute EF  Db first中使用Data Annotation asp.net MVC中使用Data ...

  3. &period;Net Core Linux centos7行—安装nginx,运行静态网站

    使用编译安装方式安装nginx Nginx下载地址:http://nginx.org/en/download.html.下载Stable version(稳定版就好).当前稳定版:http://ngi ...

  4. output&lowbar;buffering开启

    ecshop后台出现Warning: Cannot modify header information - headers already sent by 修改完PHP.ini配置文件后,一定要重启服 ...

  5. &lbrack;转&rsqb;How to add new table in NopCommerce

    本文转自:http://www.tech-coder.com/2015/07/how-to-add-new-table-in-nopcommerce.html Hey guys I am back a ...

  6. &lbrack;转&rsqb;Hive:简单查询不启用Mapreduce job而启用Fetch task

    转自:http://www.iteblog.com/archives/831 如果你想查询某个表的某一列,Hive默认是会启用MapReduce Job来完成这个任务,如下: hive> SEL ...

  7. Angularjs之表单实例(三)

    正确引用js css文件后可运行 <!DOCTYPE html> <html ng-app='myApp'> <head> <title>Bootstr ...

  8. Java并发编程:进程和线程之由来&lowbar;&lowbar;进程让操作系统的并发性成为可能,而线程让进程的内部并发成为可能

    转载自海子:http://www.cnblogs.com/dolphin0520/p/3910667.html Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨 ...

  9. &quot&semi;红色病毒&quot&semi;问题 HDU 2065 递推&plus;找循环节

    题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=2065 递推类题目, 可以考虑用数学方法来做, 但是明显也可以有递推思维来理解. 递推的话基本就是状态 ...

  10. 4&period;11Python数据处理篇之Matplotlib系列&lpar;十一&rpar;---图例,网格,背景的设置

    目录 目录 前言 (一)图例legend 1.默认不带参数的图例 2.添加参数的图例 3.将图例移动到框外 (二)网格grid 1.说明 2.源代码: 3.输出效果 (三)背景axses 1.设置全局 ...