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对象创建过程和内存结构分析

JAVA内存分配和管理是JAVA的核心技术之一,在看了尚硅谷宋红康老师讲解的JAVA内存知识之后,结合《深入理解JVM这本书》对自己所学的知识进行简单的总结,写了这篇日志。 1.JAVA内存分区 ...
  • u010001192
  • u010001192
  • 2015年05月03日 16:02
  • 2696

JAVA对象创建的过程

JVM对象创建的过程     对于java程序员来说,我们无时无刻不在创建和使用对象。使用new关键字即可快速创建一个对象,其实在new的背后,JVM为我们完成了很多事情。     JVM的字节码...
  • u011208987
  • u011208987
  • 2018年01月21日 18:19
  • 49

Java中类加载过程和对象创建过程

类加载过程: 1, JVM会先去方法区中找有没有相应类的.class存在。如果有,就直接使用;如果没有,则把相关类的.class加载到方法区 2, 在.class加载到方法区时,会分为两部分加载:先加...
  • u014338577
  • u014338577
  • 2015年11月21日 21:47
  • 5308

jvm对象的创建过程

1检查这个指令的参数是否在changlchi
  • fkyyly
  • fkyyly
  • 2014年04月30日 10:04
  • 797

Java创建对象的过程简介

简单记录一下Java创建对象的过程,就是new一个对象的时候发生了哪些事情。Java程序执行的过程在此不作说明,对象的创建过程只是程序执行过程的一部分。有关整个程序执行的过程,等熟悉了虚拟机之后在作说...
  • dachengxi
  • dachengxi
  • 2016年12月02日 11:17
  • 1366

JAVA 对象创建过程

以前一直认为自己对JAVA创建对象的过程掌握的十分不错,最近同事小黄给我拿来一道面试题 我竟然答错了,最近正好工作调整,不太忙,决定好好整理一下JAVA基础知识点。就从这道题开始。...
  • Tonylntu
  • Tonylntu
  • 2015年08月05日 14:21
  • 99

java对象创建过程 笔记

假设有个名为Dog的类 1.即使没有显式地使用static关键字,构造器实际上也是静态方法。因此,当首次创建类型为Dog的对象时(构造器可以看成静态方法),或者Dog类的静态方法/静态域首次被访问时...
  • u011580177
  • u011580177
  • 2015年07月11日 11:07
  • 219

Java对象创建的过程

当Java虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用。如果有符号引用,将检查这个符号引用代表的类是否已经被加载、解析和初始化过;如果没有,那必须先加载...
  • u010985058
  • u010985058
  • 2017年08月02日 10:34
  • 94

JAVA对象创建加载过程。

package StringDemo1; class father { static father f=new father();//产生第一输出1.这是父类的show方法 father() { ...
  • newanewlife
  • newanewlife
  • 2016年08月10日 20:49
  • 60

Java对象创建过程

Java对象的建立在最初看来只是一个new关键字而已,但是在Java的虚拟机当中,对象的创建则要显得更为复杂。在对象被用户真正调用之前在虚拟机当中大致要经历以下四个阶段。...
  • xiqiguguai1
  • xiqiguguai1
  • 2015年05月11日 19:08
  • 46
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java对象创建过程
举报原因:
原因补充:

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