在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. mvc Razor 视图中找不到 ViewBag的定义

    在Razor 视图中,我们有时会看到 ViewBag.Title 下会划一个红线,当鼠标放上去的时候会提示这样的一个错误: 找不到编译动态表达式所需的一种或多种类型,是否缺少引用? 但在项目启动运行时 ...

  2. iOS(本地通知与远程通知)

    iOS 推送通知有两种:本地推送.远程推送. 本地推送 :  在不需要联网的情况下,由APP发出推送,常用于某一时刻的通知,如闹钟.本地通送有局限性在于当APP处于后台或者退出时就无法发出通知. 远程 ...

  3. oracle 队列

    Oracle 高级队列(AQ) 适用对象:初步了解oracle高级队列人群 注意事项: 序号 注意事项 1 JMS监听部分可参考官方文档: http://docs.oracle.com/cd/e128 ...

  4. funny_python 00 The Zen of Python

    # 打算每天多动的时候尽量搜索一些和coding相关的funny stuff Day 00 - PEP 20 The Zen of Python 在shell里面输入python -m this 回车 ...

  5. 利用JDK(1.6及以上版本)创建WebService

    一.什么是WebService WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络 ...

  6. Centos实现回收站机制

    作为一个运维人员,在服务器上删除文件时为了方便经常会直接使用rm *.txt这类通配符,甚至为了省事加-rf参数,如果是确定的话还好,要是在删除的时候一个不留神,那事可就大了. 俗话说常在河边站哪有不 ...

  7. 【总结】清除webbrowser cookie/session的6种方法

    下面是我测试下来的6种清除webbrowser中cookie的6种方法: //方法一:调用 wininet.dll清除cookie (推荐) SuppressWininetBehavior(); // ...

  8. hibernateTemplate中常用查询方法的使用(原文地址: http://dongruan00.iteye.com/blog/1772311)

    一.find(String queryString); 示例:this.getHibernateTemplate().find("from bean.User"); 返回所有Use ...

  9. WinForm richtextbox 关键字变红色

    private void HilightRichText(RichTextBox control, string hilightString)        {            int nSel ...

  10. phpstudy 出现“请自行检查是否安装VC9运行库??”问题 -- 缺少vc9库

    phpStudy是一款PHP调试环境的程序集成包,该程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安装,无须配置即可使用,是非常方便.好用的 ...