一个对象从无到有的过程

A a = new A()

1、JVM遇到new指令就会去堆内存分配一块内存空间,内存的大小在编译期间就可以确定

2、接着调用A的构造函数,这里构造的时候会沿着继承树逆流而上,一直到Object。

  先看一段代码:

 package jvm.test3;

 public class Sup {

     public int a;
public String b; Sup(int a, String b){
System.out.println("Sup constructor!!!");
System.out.println(this.getClass().getName());
this.a = a;
this.b = b;
this.printMsg();
} private void printMsg(){
System.out.println("Sup: " + "a=" + a + " b=" + b);
}
} package jvm.test3; public class Sub extends Sup{ Sub(int a, String b) {
super(a, b);
System.out.println("Sub constructor!!!");
} } package jvm.test3; public class Test { public static void main(String[] args) {
new Sub(11,"hello");
} }

输出:

Sup constructor!!!
jvm.test3.Sub
Sup: a=11 b=hello
Sub constructor!!!

这段代码中,我主要想说一下第10行和第13行。

先说说this。在实例方法中,JVM会默认隐藏的传递一个参数,这个参数就是当前调用的实例本身,在方法内就可以通过this操作。

但是等等,在Sup的构造方法中,this却是jvm.test3.Sub类的实例。为什么???

从头再看初始化顺序:new Sub(11,"hello"),new指令会分配一块内存存放Sub对象的数据,然后返回一个引用(假设叫ref)指向这个对象。JVM会去调用Sub的构造方法,并将ref隐藏的传递给构造方法,所以在Sub的构造方法中的this就是ref。但是,Sub的构造方法先去调用父类Sup的构造方法,而JVM这时候隐藏传递进去的还是ref,还是指向Sub实例的引用。

但是又产生一个问题,竟然是Sub的实例,为什么能调用父类Sup的私有方法printMsg???

我想到一种解释:隐藏的参数的类型是本类型。什么意思?就是说在Sup类的所有方法中,隐藏的参数的类型是Sup。所以,当传来一个Sub类的引用ref的时候,进行了一次向上转型

虽然我觉得非常合理,但是还没有找到验证的方法。大家有懂的或者有其他的想法可以指正。 

            参考《深入Java虚拟机》

JVM与对象初始化的更多相关文章

  1. JVM中对象的创建过程

    JVM中对象的创建过程如以下流程图中所示: 对其主要步骤进行详细阐述: 为新生对象分配内存: 内存的分配方式: 指针碰撞:假设Java堆中内存是绝对规整的,所有用过的内存放在一边,空闲的内存在另一边, ...

  2. Java对象初始化详解

    在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.本文试图对Java如何执行对象的初始化做一个详细深入地介绍(与对象初始化相同,类在被加载之后也是需要初始化的,本 ...

  3. Java对象初始化详解(转)

    在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.本文试图对Java如何执行对象的初始化做一个详细深入地介绍(与对象初始化相同,类在被加载之后也是需要初始化的,本 ...

  4. Java类和对象初始化

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

  5. 【转】两道面试题,带你解析Java类加载机制(类初始化方法 和 对象初始化方法)

    本文转自 https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html 关键语句 我们只知道有一个构造方法,但实际上Ja ...

  6. java 复习整理(五 类加载机制与对象初始化)

    类加载机制与对象初始化   一 . 类加载机制 类加载机制是指.class文件加载到jvm并形成Class对象的机制.之后应用可对Class对象进行实例化并调用.类加载机制可在运行时动态加载外部的类, ...

  7. Java变量、Java对象初始化顺序

    局部变量与成员变量: 局部变量分为: 行参:在方法签名中定义的局部变量,随方法的结束而凋亡. 方法内的局部变量:必须在方法内对其显示初始化,从初始化后开始生效,随方法的结束而凋亡. 代码块内的局部变量 ...

  8. java类加载和对象初始化

    对象初始化过程:  1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化:  2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化:  3.其次,初 ...

  9. 【转】Java对象初始化详解

    来源:MySun 链接:http://mysun.iteye.com/blog/1596959 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.本文试图对Jav ...

随机推荐

  1. POPTEST老李分享session,cookie的安全性以及区别 1

    POPTEST老李分享session,cookie的安全性以及区别   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程 ...

  2. thinkphp3.2.x多图上传并且生成多张缩略图

    html部分 <!DOCTYPE html><html><head><meta http-equiv="Content-Type" con ...

  3. cmd输入svn提示svn不是内部或外部命令

    已经安装了svn,但是在cmd中输入svn命令的时候提示svn不是内部或外部命令是因为没有安装svn client. 解决办法: windows安装svn的时候默认是不安装 svn comand li ...

  4. [笔记]RankSVM 和 IR SVM

    之前的博客:http://www.cnblogs.com/bentuwuying/p/6681943.html中简单介绍了Learning to Rank的基本原理,也讲到了Learning to R ...

  5. 对比字节流和字符流,回答为什么FileReader不能用来拷贝图片

    FileReader是输入字符流,拷贝文件没问题,但拷贝图片就有问题了. 假设是在windows下,FileReader用的是GBK码表,一个字符最多用2个字节代表.2个字节就是2的16次方,即有65 ...

  6. Use “error_messages” in Rails 3.2? (raises “undefined method” error)

    I am getting the following error in my Rails 3.2 functional tests: ActionView::Template::Error: unde ...

  7. druid 连接kafuk

    java -Xmx256m -Duser.timezone=UTC -Dfile.encoding=UTF-8 -Ddruid.realtime.specFile=examples/indexing/ ...

  8. CSS样式表初学,比C#和JS简单

    今天咱们一起来看下CSS样式表的基本基础 经常看博客或者喜欢钻研代码这一类的人对CSS可能有所耳闻,但具体的可能不是很清楚 那什么是CSS呢?与HTML又有什么区别呢?今天咱们就来说道下这个CSS C ...

  9. zabbix主动上报的python脚本

    本代码linux.window平台通用. 不过我遇到一个Windows2008缺少运行库的提示,可能这个是Python3.6开发的.需要安装vc2015运行库吧.我没调试成功. linux平台还可以监 ...

  10. 架构设计之Spring-Session分布式集群会话管理

    前言 通常在web开发中,回话管理是很重要的一部分,用于存储与用户相关的一些数据.对于JAVA开发者来说,项目中的session一般由Tomcat或者jetty容器来管理. 特点介绍 尽管使用特定的容 ...