在Java中,

  当一个类被调用的时候,它的初始化过程是怎么样的呢?

  当一个类被实例化的时候,它的初始化过程又是怎样的呢?

  为什么static方法不能未经对象就调用非static方法?

  下面我们通过例子来找出答案。

 

当该类没有父类时

  测试代码:  

public class ClassLoadingTest {
static String staticString=getStaticString(); //静态成员变量
private String privateString=getPrivateString();//普通成员变量
public ClassLoadingTest() {
System.out.println("Loading ClassLoadingTest()");
} public static void loadStaticMethod() {
System.out.println("Loading static method");
} private void loadNotStaticMethed(){
System.out.println("Loading NotStaticMethed");
} private String getPrivateString() {
String string=new String("Loading private variable");
System.out.println(string);
return string;
} private static String getStaticString() {
String string=new String("Loading static variable");
System.out.println(string);
return string;
} public static void main(String[] args) {
loadStaticMethod(); //加载静态方法
System.out.println("try to new ClassLoadingTest()");
ClassLoadingTest test=new ClassLoadingTest();
test.loadNotStaticMethed();//加载普通方法
} }

  打印结果:  

     Loading static variable

   Loading static method

   try to new ClassLoadingTest()

   Loading private variable

   Loading ClassLoadingTest()

   Loading NotStaticMethed          

  分析结果:

    1. 当调用该类的某个静态方法时,首先加载该类的静态成员变量和静态方法(此时类还没有实例化)
    2. 当new该类之后,会加载该类的普通成员变量,然后才是构造方法。

  得出结论:

    当一个类没有父类的时候,加载顺序为:

    静态成员变量/静态方法-->开始实例化-->普通成员变量/普通方法-->构造方法-->实例化结束。

当该类有父类的时:

  测试代码:

    父类:

public class ClassLoadingTestSuper {
static String staticString=getSuperStaticString(); //父类的静态成员变量
private String privateString=getSuperPrivateString(); //父类的普通成员变量
public ClassLoadingTestSuper() {
System.out.println("Loading ClassLoadingTestSuper()");
} private String getSuperPrivateString() {
String string=new String("Loading super class private variable");
System.out.println(string);
return string;
} private static String getSuperStaticString() {
String string=new String("Loading super class static variable");
System.out.println(string);
return string;
} }

    子类:

public class ClassLoadingTest extends ClassLoadingTestSuper {

/*内容与ClassLoadingTest相同*/

}

  打印结果:

Loading super class static variable

Loading static variable

Loading static method

try to new ClassLoadingTest()

Loading super class private variable

Loading ClassLoadingTestSuper()

Loading private variable

Loading ClassLoadingTest()

Loading NotStaticMethed

  分析结果:

    1. 首先加载的是父类的static变量和方法;
    2. 然后加载的是该类的static变量和方法;
    3. 将该类实例化;
    4. 然后加载的是父类的普通成员变量和方法;
    5. 然后加载的是父类的构造方法;
    6. 然后加载的是该类的成员变量和方法;
    7. 然后加载的才是该类的构造方法;
    8. 最后实例化结束,外部才可以操作该对象。

  得出结论:

    当该类有父类的时候,类的实例化的加载过程是:

      父类的static成员变量和方法-->该类的static变量和方法-->开始实例化-->父类的普通成员变量和方法-->父类的构造方法-->该类的普通成员变量和方法-->该类的构造方法-->实例化结束。

【Thinking in Java】类和对象的初始化过程的更多相关文章

  1. 解析Java类和对象的初始化过程

    类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要的两个环节,Google 了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和 JVM 层次来 ...

  2. [转载]解析 Java 类和对象的初始化过程

    原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-clobj-init/index.html 由一个单态模式引出的问题谈起 类的初始化和对象初始化 ...

  3. Java基础——类和对象的初始化过程

    本节把类和对象的初始化所涉及到的所有代码块阐述一边. 示例代码: public class Demo { private static String name; private String age; ...

  4. AJPFX总结Java 类与对象的初始化

    面试的时候,经常会遇到这样的笔试题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和静态块,它们只包含一些简单的输出字符串到控制台的代码,然后让我们写出正确的输出结果.这实际上是在考察 ...

  5. Java类的实例化的初始化过程

    A a = new A(); new 创建对象过程: 1.类加载     代码验证 2.给对象在内存(堆)中分配空间(给属性赋值): 3.属性赋默认值: byte,short.int,long -&g ...

  6. Java类和对象初始化

    类的生命周期: Java类的初始化: 本阶段负责为类变量赋正确的初始值.(类变量即静态变量) Java编译器把所有的类变量初始化语句和静态初始化器通通收集到<clinit>方法中,该方法只 ...

  7. JAVA基础之对象的初始化

    本文主要记录JAVA中对象的初始化过程,包括实例变量的初始化和类变量的初始化以及 final 关键字对初始化的影响.另外,还讨论了由于继承原因,探讨了引用变量的编译时类型和运行时类型 一,实例变量的初 ...

  8. [Java初探08]__简单学习Java类和对象

    前言 在前面的学习中,我们对面向对象的编程思想有了一个基本的了解,并且简单的了解了类和对象的定义.那么类和对象在Java语言中是如何表现的,这次,就从实际出发,学习一下一下类和对象在Java语言中的使 ...

  9. 【基础】java类的各种成员初始化顺序

    父子类继承时的静态代码块,普通代码块,静态方法,构造方法,等先后顺序 前言: 普通代码块:在方法或语句中出现的{}就称为普通代码块.普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出 ...

随机推荐

  1. 学习shell脚本笔记

    1.if 是单分支语句,使用格式如下: if condition ; then statement ….. fi 2.if … else 是双分支语句,使用格式如下: if condition ; t ...

  2. JS实现的随机显示图片

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  3. centos分区

    /boot :用来存放与 Linux 系统启动有关的程序,比如启动引导装载程序等,建议大小为 100MB . /usr :用来存放 Linux 系统中的应用程序,其相关数据较多,建议大于 3GB 以上 ...

  4. [python] ORM 第一次注释

    不懂的东西还太多,就当是自己监督自己吧 #!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = 'Michael Liao' impor ...

  5. EditTextPreference点击后输入框显示隐藏内容,类似密码输入(转)

    http://bbs.anzhuo.cn/thread-928131-1-1.html EditTextPreference点击后输入框显示隐藏内容,类似密码输入... [复制链接]     aski ...

  6. C++设计模式——简单工厂模式

    简单工厂模式(Simple Factory Pattern) 介绍:简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些.因为它至少不是Gof23种设计模式之一.但它在实际的编程中经常被用 ...

  7. linux学习笔记--文件

    文件系统 ls -lhi i inode 相当于文件在磁盘里的唯一标示,index node h 代表文件大小k,m [root@masters ~]# [root@masters ~]# ls -l ...

  8. LDAP与禅道

    一:搭建禅道做测试  搭建过程参考http://www.cnblogs.com/hiyu/p/5841650.html 1):下载 ZenTaoPMS.Pro5.5.1.zbox_64.tar.gz ...

  9. 第15章 .NET中的反射

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...

  10. getWinSystemIcon

    #include <QtGui/QImage>#include <QtGui/QPixmap>void getSystemIcon(const chConstStringA&a ...