`

java解惑(一)之类的初始化

    博客分类:
  • JAVA
 
阅读更多

         

                                                            学而不精则淡,精而不用则废。

           了解包括继承和static在内的初始化权过程,以对所发生的一切有个全局性的把握,是很有益的。请看下面一个例子:

         

class Insect {
	private int i = 0;
	protected int j;

	static{
		System.out.println("static codes initialized!");
	}
	public Insect() {
		super();
		System.out.println("i=" + i + ",j=" + j);
		j = 39;
	}

	private  int x1 = printInit("static Insect.x1 initialized");

	 int printInit(String s) {
		System.out.println(s);
		return 47;
	}

}

 

public class Beetle extends Insect {
	private int k = printInit("static Beetle.k initialized");
	static{
		System.out.println(" Beetle static codes initialized!");
	}
	public Beetle() {
		super();

		System.out.println("k=" + k);
		System.out.println("j=" + j);

	}

	private  int x2 = printInit("static Beetle.x2 initialized");

	public static void main(String[] args) {
		System.out.println("Beetle Constructor");

		Beetle b = new Beetle();
	}

}

    output

 

    

    static codes initialized!
    Beetle static codes initialized!
    Beetle Constructor
    static Insect.x1 initialized
    i=0,j=0
    static Beetle.k initialized
    static Beetle.x2 initialized
    k=47
    j=39

 

   小叶有点想不通为什么会这样子?其实,搞清楚了static和继承对类的加载顺序的影响就懂了。

   第一步,Beetle找到主程序路口---main方法,然后找到该类的class文件,发现该类还有个 基类。

   第二步:进入Insect类,按照代码书写顺序,加载static代码块,打印出static codes initialized!

   第三步:继续在Insect类中找,发现没有static属性,回到派生类Beetle,加载static代码块,打印出Beetle static codes initialized!(static依赖于类生存的,并且static修饰的代码块或者属性,有且只会加载一次!!!)    第四步:main方法执行,打印Beetle Constructor。第五步:执行到Beetle b = new Beetle(),加载Beetle无参构造方,因为考虑到有继承,会直接进入super(),由于全局变量有默认值的关系,所以打印 static Insect.x1 initialized. i=0,j=0。

   第五步:这一步很容易出错,也很关键。当加载完基类的构造器后,程序跳出来不是回到派生类的构造器,而是回到派生类定义属性的地方。加载完类的属性才会再回到构造器加载完余下的部分。打印static Beetle.k initialized,static Beetle.x2 initialized,k=47   j=39

  

   小叶把代码又改了一下:

   

class Insect {
	private int i = 0;
	protected int j;

	static{
		System.out.println("static codes initialized!");
	}
	public Insect() {
		super();
		System.out.println("i=" + i + ",j=" + j);
		j = 39;
	}

	private  static int x1 = printInit("static Insect.x1 initialized");

	static int printInit(String s) {
		System.out.println(s);
		return 47;
	}

}

 

 

    

 public class Beetle extends Insect {
	
	static{
		System.out.println(" Beetle static codes initialized!");
	}
	public Beetle() {
		super();

		System.out.println("k=" + k);
		System.out.println("j=" + j);

	}
	private static int k = printInit("static Beetle.k initialized");
	private  static int x2 = printInit("static Beetle.x2 initialized");

	public static void main(String[] args) {
		System.out.println("Beetle Constructor");

		Beetle b = new Beetle();
	}

}

 

 

    跟上面的例子有两个不同:原本的属性使用了static修饰,派生类定义属性的代码放在了构造器代码下面。运行了一下,打印出

   

static codes initialized!
static Insect.x1 initialized
 Beetle static codes initialized!
static Beetle.k initialized
static Beetle.x2 initialized
Beetle Constructor
i=0,j=0
k=47
j=39

   你做对了?

分享到:
评论

相关推荐

    JAVA面试题解惑系列——类的初始化顺序

    首先,需要了解Java类初始化的基本规则,即在类的静态变量、静态初始化块、变量、初始化块、构造器这五个部分中,它们的初始化顺序依次是:静态变量、静态初始化块、变量、初始化块、构造器。这个顺序在单个类中是...

    JAVA面试题解惑系列类的初始化顺序JAVA程序员JAVA工程师面试必看.pdf

    Java语言中的类初始化顺序是面试中常见的问题,尤其对于Java程序员和工程师来说,理解这一概念至关重要。本篇文章将深入解析类初始化的顺序以及在继承...因此,熟练掌握类初始化顺序是每个Java程序员的基础技能之一。

    JAVA面试题解惑系列.pdf

    通过本文的讲解,我们深入了解了Java中类的初始化顺序,特别是针对静态成员与实例成员之间的区别,以及在继承情况下类初始化的具体流程。这对于Java开发者而言是非常重要的基础知识点,不仅有助于通过面试,也能在...

    JAVA面试题解惑系列by(zangweiren)

    这些成员只在类首次被加载时初始化一次。 2. **实例变量**和**初始化块**:接着是类中的非静态成员,即实例变量和非静态初始化块。这些成员在每次创建对象时都会被初始化。 3. **构造器**:最后执行的是构造器,用于...

    JAVA面试题答疑解惑

    构造器方法用于初始化一个新创建的对象。 在继承的情况下,类的初始化顺序会稍微复杂一些。基类的静态成员会在派生类的静态成员之前初始化。但是,一旦派生类的对象被创建,基类的非静态成员会在派生类的非静态成员...

    JAVA面试题解惑系列合集

    1. 类的初始化顺序:在JAVA中,类的初始化顺序遵循一定的规则,当一个类被加载时,它的静态变量、静态初始化块、变量、初始化块、构造器将会按照特定的顺序被初始化。具体顺序为:首先初始化静态变量和静态初始化块...

    IT学生解惑真经.pdf

    本文将详细介绍Java中类初始化的规则以及继承情况下的初始化顺序,帮助读者更好地理解和应对这类问题。 #### 类初始化顺序概述 在Java中,类的初始化顺序包括静态成员(变量和初始化块)、实例成员(变量和初始化块...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    3.7.3 Web应用初始化参数的配置 3.7.4 application对象应用示例 3.8 其他内置对象的应用 3.8.1 应答与请求的page对象 3.8.2 页面上下文的page Context对象 3.8.3 获取web.xml配置信息的config对象 3.8.4 获取异常...

    springboot133在线课程管理系统.zip

    在信息技术领域,SpringBoot框架因其简洁、高效、易用的特点,被广泛应用于开发各种Web应用程序,尤其是在构建企业级应用时,SpringBoot更是首选之一。本系统——“SpringBoot 133在线课程管理系统”便是基于...

Global site tag (gtag.js) - Google Analytics