`
甜甜的眼泪
  • 浏览: 15523 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

深入探究java中拓展类(子类)的初始化过程

阅读更多

      如果不懂java中初始化过程,那么就不能称你懂java。今天我总结了一下java中的初始化过程。并通过一个例子加深理解。

     当你运行一个java程序时,

       1  首先计算机去找类的路径classpath(该路径是你设置的环境变量)

        2 通过路径找到.class文件。

        3  在JVM中进行类的加载,发现有父类 进行4

        4  在classpath中找到父类的.class文件 

        5   对父类中静态资源进行初始化

        6  对子类的静态资源初始化

        7 如果主函数中有对象的产生 那么进行 8,9,10,11

        8 父类成员属性的初始化

        9  父类构造方法的初始化

       10 子类成员属性的初始化

       11 子类构造方法的初始化

     下面一段代码可以加深理解

 

class Shape {
	private static int i;
	protected static int j=10;
	Shape () {
		System.out.println ("i = " + i + ", j = " + j);
		j = 5;
	}
	private static int x1 = printInit("private Shape.x1 initialized");   //1
	static int printInit(String s) {
		System.out.println (s);
		return ++i;
	}
}

public class Circle extends Shape {
	int k = printInit("Circle.k initialized");
	public Circle () {
		System.out.println ("k = " + k);
		System.out.println ("j = " + j);
		System.out.println ("x2 = " + x2);
		super.printInit("super");
	}
	public static int x2 = printInit("public Circle.x2 initialized");
	public static void main(String[] args) {
		System.out.println ("Circle constructor");
		Circle b = new Circle ();
		System.out.println ("b.k="+b.k);

	}
}

   下面开始讨论这个例子

 

       1  首先计算机去找类的路径classpath(该路径是你设置的环境变量)

        2 通过路径找到Circle.class文件。

        3  在JVM中进行类的加载,发现有父类 Shape进行4

        4  在classpath中找到父类的 Shape.class文件 

        5   对父类中静态资源进行初始化   初始化结果:private static int i;初始化的时候如果没有赋值,基本类型都会被初始化为0,对象引用被初始化为null。这一句得到i=0;protected static int j=10;得到j=10;

      private static int x1 = printInit("private Shape.x1 initialized");   //1
      static int printInit(String s) {
        System.out.println (s);
        return ++i;
    }  那么改程序的第一句将输出private Shape.x1 initialized;并且i=1;

        6  对子类的静态资源初始化

    public static int x2 = printInit("public Circle.x2 initialized");
   那么将输出第二句public Circle.x2 initialized  并且i=2; x2=2

    由public static void main(String[] args) {
        System.out.println ("Circle constructor");
        Circle b = new Circle ();
        System.out.println ("b.k="+b.k);

    }  将输出第三句:Circle constructor   。

        7 主函数中有对象的产生 那么进行 8,9,10,11

        8 父类成员属性的初始化   父类中没有成员属性

        9  父类构造方法的初始化

Shape () {
        System.out.println ("i = " + i + ", j = " + j);
        j = 5;
    }将输出i=2,j=10  然后j=5

       10 子类成员属性的初始化

       int k = printInit("Circle.k initialized");将输出:Circle.k initializd  然后i=3  k=3

       11 子类构造方法的初始化

     public Circle () {
        System.out.println ("k = " + k);
        System.out.println ("j = " + j);
        System.out.println ("x2 = " + x2);
        super.printInit("super");
    }  将输出k=3  j=5  x2=2   super   并且i=4

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

   将输出结果  b.k=3

 那么最终输出结果为

 

private Shape.x1 initialized
public Circle.x2 initialized
Circle constructor
i = 2, j = 10
Circle.k initialized
k = 3
j = 5
x2 = 2
super
b.k=3

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics