java对象创建过程

原创 2005年05月21日 22:57:00

凡是用过面向对象语言的人都写过构造函数(废话一句),java程序员更是如此。由于java是纯面向对象的语言,所以可能造成构造函数满天飞的情况....但是,你知道,当执行构造函数的时候,这短短的一句在JVM中都做了什么吗?

看下面一段代码

class A{
 public int varA;
 public A(){
  System.out.println("inside A");
  getVar();
 }
 public void getVar(){
  varA = 321;
  System.out.println("varA = " + varA);
 }
}
public class B extends A{
 public int varB = 123;
 public B(){
  System.out.println("inside B");
  getVar();
  System.out.println("varA = " + varA);
 }
 public void getVar(){
  System.out.println("varB = " + varB);
 }

 public static void main(String[] args){
  new B();
 }
}

奇怪吧,下面解释一下调用new B()时到底发生了什么

奇怪吧,下面解释一下调用new B()时到底发生了什么
  1. 当然是调用B的构造函数了
  2. 由于B是从A继承而来,会默认的调用A的无参构造函数。这里注意,如果A没有提供默认构造函数,而是提供了有参的构造函数,编译将会出错
  3. 初始化A中的实例变量。由于varA没有在声明时赋值,JVM会将它初始化为0。此时,还没有执行A构造函数中的代码。
  4. 执行System.out.println("inside A"),输出第一行。然后调用getVar()。这里可以花时间解释一下为什么输出的是varB而不是varA。getVar()是覆盖方法。在java中,覆盖方法是动态决定的,也就是根据拥有它的对象类型来执行,而不是根据引用类型来决定。这一点正好和重载方法相反。因此,这里会执行联编后B的getVar(),而此时varB还没有初始化,所以默认为0
  5. 执行到这里,A类构造函数的内容已经完毕,返回B的构造函数,执行System.out.println("inside B")
  6. 此时继续执行getVar(),这时也是执行B的方法,由于varB在声明时已经显示初始化,故输出varB = 123
  7. 执行System.out.println("varA = " + varA)。从前面可以看出,A类的getVar()根本没有执行,所以varA一直没有被赋值,所以它的值还是0

没想到吧,一句短短的new B()可以引起这么多的调用。其实,如果涉及到静态域或变量,情况要比上面复杂的多,有兴趣的朋友可以试验一下

总结一下,关于调用构造函数创建一个类的过程如下

  1. 调用构造函数
  2. 初始化该类的静态变量
  3. 初始化该类的静态块(static block)
  4. 调用该类构造函数的第一句(super或this)。如果没有写出,默认调用super()
  5. 初始化变量/执行语句块
  6. 执行构造函数剩下的内容

java对象创建过程

  • 2012年04月29日 10:36
  • 574B
  • 下载

深入理解JVM : Java堆中对象创建、布局、访问全过程

一、对象的创建new Animal();1.类加载检查:检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的...

Java创建对象过程中,内存的分配

我们都知道,要使用类,就一定要为其创建对象。那么,在创建对象过程中,内存是如何分配的呢? 类的本质是一种引用数据类型,这与数组是一样的。比如本文提供的简单例子程序中的Person类,它有两个属性,n...

java对象创建(内存模型)过程详解

java对象创建详细过程步骤、jvm内存结构:声明对象引用和创建对象实体。类信息、对象引用、对象实体均在内存的不同区域。 内存结构 每一个java应用程序均会唯一的对应一个jvm实例,而这个jvm实...

java内存结构和对象创建的过程

点击打开链接 在学到毕老师视频中介绍关于java内存结构的时候,感觉这些内容特别重要。结合视频和对《深入理解java虚拟机》这本书的一些理解写了这篇日记。  java内存分配和管理是jav...

java对象创建过程及初始化顺序

转自:http://blog.csdn.net/yakihappy/article/details/3979357Java虚拟机创建一个对象都包含以下步骤:(1)给对象分配内存。(2)将对象的实例变量...

JVM源码分析之Java对象的创建过程

来源: 简书占小狼http://www.jianshu.com/users/90ab66c248e6/latest_articles 乘着年轻,多学习 接着上篇《JVM源码分析之J...

JVM源码分析之Java对象的创建过程

本文将基于HotSpot实现对Java对象的创建过程进行深入分析。定义两个简单的类AAA和BBB通过``javap -c AAA```查看编译之后的字节码,具体如下:Java中的new关键字对应jvm...
  • undoner
  • undoner
  • 2017年03月22日 09:45
  • 342

java加载类创建对象的过程以及静态代码段的执行时机

静态代码段只有在需要的时候才会引发: 什么时候需要呢? Outer.Inner inner;或Outer.Inner innner=null;只是定义变量而已不会引发静态代码段,但是应该会检查这个...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java对象创建过程
举报原因:
原因补充:

(最多只允许输入30个字)