Java内存分析,加载类中包含其他类的加载顺序

已知一个Person类,包含的属性home属于Home类
public class Person {
String name;
int age;
String[] hobby;
Home home;

省略get、set方法等。。。

}

public class Demo {
public static void main(String[] args) {
Person p = new Person();
p.setAge(18);
p.setName("小鱼");
Home h = new Home();
h.setAddress("长春");
h.setArea(100);
h.setRoomNum(3);
p.setHome(h);
}
}

在执行main方法时(前台Person类和Home类之前都没有加载过),遇到Person p = new Person();加载Person类,加载Person类的时候会同时加载Home类吗,还是只有等到执行到Home h = new Home();才会加载Home类。。

0

10个回答

java类加载器加载顺序:
1、先加载父类再加载子类
2、先加载类属性再加载实例属性
3、同等状况下从上往下加载

像你说的 new Person(),这是一个new表达式,表示申请一个堆区实例。为了生成该实例,首先会加载Person这个类(喊带static的部分),
然后加载构造方法,在加载构造方法的过程中会在堆区生成实例,并初始化,从上往下初始化age、name、hobby、home 4条属性,初始化home时当然就要加载Home类。
其实你可以启动debug模式查看加载顺序。

1

JVM的一个思想,那就是–JVM运行程序时,是用到该类的对象,才会去加载该类到方法区。如果方法区已经加载过该类了,不会再去加载该类。

1

首先加载的是static类,其次是import 的类,最后是本地类;加载和实例化是两个概念

0

在jvm中,一般情况下,对象的创建都是在new这个关键字后才分配空间的,所以new Person()的时候是不会加载Home的

0
qq_22222663
黑化肥挥发会发灰 但确实是在new Home()的时候加载的
一年多之前 回复
qq_22222663
黑化肥挥发会发灰 加载和实例化是两个概念。
一年多之前 回复

在方法或语句中出现的{}就称为普通代码块。普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”

0

当一个类被主动使用的时候 虚拟机才会去加载 比如new .Class

0

person类 和Home类中加入测试块
public class Person {
static {
System.out.println("Person static");
}
public Person() {
System.out.println("person constructor");
}
}
public class Home {
static {
System.out.println("Home static");
}

public Home() {
    System.out.println("Home constructor");
}
}

Demo main 中运行Person p = new Person();
结果:Person static person constructor
Think in java有这么一句话:当一个程序创建第一个对类的静态成员的引用时,就会加载这个类。构造器是类的静态方法。

0

Person p = new Person();
1、执行Person的静态代码块;
2、给成员变量赋默认值(_包含home初始化);
3、执行Person的构造代码块;
4、执行Person的构造函数。

0

new一个对象的时候,才会为这个对象分配内存,然后按照先静态,后非静态;先声明,后赋值;先属性,后方法;先父类,后子类的顺序初始化。

0

加载person类的时候就加载home类了。

-1
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java中的类加载执行顺序
Java中类加载执行顺序是:rn主类中的静态代码块–>父类中的静态成员和静态代码块–>子类中的静态成员和静态代码块–>父类中的成员变量和构造代码块–>父类中的构造方法–>子类中的成员变量和构造代码块–>子类构造方法rn示例:rnpackage classTest;rnrnclass Father {rn public Father(){rn System.out.print...
Java中类及方法的加载顺序
代码展示nn请运行下面代码,查看运行结果,并带着问题,尝试第二次debug程序。nnnclass A {n private static int numA;n private int numA2;n n static {n System.out.println("A的静态字段 : " + numA);n System.out.println("...
Java类中各模块的加载顺序的JVM本质理解
Java类中各模块的加载顺序只是表象,但至于为什么我们需要理解JVM的加载本质原理。
spring加载类的顺序
spring @Order标记order标签是用来指定加载bean的顺序,数字越小越先加载。其中的spring的xml配置文件,内容完善一下。在使用标签<context:component-scan/>的情况下,是不需要<context:annotation-config />原因参考:SpringMVC - context:annotation-config与mvc:an...
Java类加载的过程
JVM和类nn当我们调用 Java 命令运行某个 Java 程序时,该命令将会启动一条 Java 虚拟机进程,不管该 Java 程序有多么复杂,该程序启动了多少个线程,它们都处于该 Java 虚拟机进程里。同一个 JVM 的所有线程、所有变量都处于同一个进程里,它们都使用该 JVM 进程的内存区。当系统出现以下几种情况时, JVM 进程将被终止:nn程序运行到最后正常接收;n 程序运行到使用Sys...
java的类加载顺序和创建对象时的调用顺序
java的类加载顺序和创建对象时的调用顺序类的加载顺序创建对象的过程注意n类的加载顺序n有父子关系的类在加载时n先调用父类静态初始化块,静态属性,但不包括静态方法,然后再是,子类静态初始化块,静态属性,但同样不包括静态方法 。n创建对象的过程n先是父类非静态初始化块,非静态属性 ,再是父类构造函数,然后是子类非静态初始化块,非静态属性 ,最后是子类构造函数nn运行结果nn注意n(1)子类在继承父类...
Java类加载过程图解
朋友给我发了一道有意思的题目,如下nnnn为什么用.class的方式加载类和以Class.forName()的方式加载的结果不同呢,原因很简单,就是类加载过程的不同。nn这就扯到基础理解上了,就是Java是如何加载一个类的呢?nnnn上图是我绘制的整个Java类加载过程。nn首先是编译期,将Java源文件也就是敲好的代码通过编译,转换成.class文件,也就是字节码文件(byte),然后经过传输传...
类加载顺序
目录nn一、类加载做了哪些事?nn二、类加载的顺序nn三、一个具体说明的例子nn四、类加载前和加载后的执行顺序(转自http://blog.csdn.net/mrzhoug/article/details/51581994)nn一、类加载做了哪些事?nn  之前没有进行类加载n 1.类加载,同时初始化类中静态的属性(赋默认值)n 2.执行静态代码块n 3.分配内存空间,同时初始化非静态的属性(赋默...
jvm类加载顺序
JVM类加载顺序rn今天,梳理一下类加载顺序,从测试结果来推测类加载顺序。rn第一步:基础准备rn父类:rnpublic class Parentrn {rnrnpublic  StringrnparentProperty="ParentPropertyValue";rnrnpublic static StringrnstaticParentProperty="StaticParentProper
类加载的三种方式
类加载分为动态加载和静态加载。动态加载是从外存储器中加载类,一般类加载机制分析的也是动态加载。而静态加载本质上是从内存中创建类的实例对象,此时类已经被加载到内存中。nn一.静态加载nn1.nnnn通过new关键字来创建Test的实例对象。nn二.动态加载nn1.nnnn 通过Class.forName()来加载类,然后调用类的newInstance()方法实例化对象。nn2.nnnn  通过类加载...
Java类中的各种成员的加载顺序
源代码:rnrnrnpublic class SuperAndSub {nn public static void main(String[] args) {nn // Super s1 = new Sub();n // Super s2 = new Super();n Sub s3 = new Sub();n }n}nnclass Super {nn static int a = getA
python类加载分析-类属性-实例方法-类方法-静态方法对比
一、 概述 n本文对python3的类加载过程进行分析,python最核心原理,有下面内容 n1、 类对象 n2、 实例对象 n3、 self变量名称问题 n4、 类属性、实例变量、局部变量 n5、 类方法 n6、 实例方法 n7、 类方法与实例方法相互调用 n8、 静态方法 n二、 pytyon类对象 n1、 pytyon是脚本语言 npyton的代码在编绎时,无论是函数,...
简述Java类加载方式及流程
在慕课网学习反射时想到自己之前学过的知识,故整理一番,希望能提供一点帮助,水平有限,如若有误欢迎指正。nnJava提供了两种类的装载方式。一是预先加载,二是按需加载。因为可以对类进行按需加载,所以程序在启动时不需要把所有的类都装载到JVM中,大部分类都被延迟到使用时才动态加载。nn1.预先加载nn这里有Java基础类的加载和含main()函数类的加载。类加载器见文末补充。nnJava基础类的加载流
JAVA类加载与初始化顺序
 nn类的生命周期nn7个阶段依次为:Loading Verification Preparation Resolution Initialization Using Unloadingnnnn类加载的双亲委派模型nn各个加载器都是先委托自己的父加载器加载类,若确实没加载到再自己来加载nn于是java默认的类查找加载顺序是自顶向下的,树状结构nn双亲委托的意图是保证java类型体系中最基础的行为一...
Android 面试经验 - 类的加载机制
类的加载机制nn参考资料: nJava 类加载机制(阿里面试题) n从经典面试题看java中类的加载机制 n面试官:请你谈谈Java的类加载过程 n深入理解Java类加载器(ClassLoader)nnnn目录nnnn类的加载机制n目录n类加载器n启动类加载器n扩展类加载器n应用程序类加载器n自定义类加载器nnn类加载机制n全盘负责n双亲委派模型n缓存机制nnn类加载器中的四个重要方法nloadC...
Java中类加载的执行顺序
一、Java中的类加载demo顶层基类Base.java:public class Base {n public static int a = 10;n public int b = 20;n staticn {n System.out.println("----Base---: Static Init Base " + a);n // Syste
jvm-类加载过程
1.类加载机制nn类加载阶段:虚拟机要完成的3件事情: n 1)通过一个类的完全限定名来 获取 此类的二进制字节流 n 2)将这个字节流所代表的静态 存储结构转化为方法区的运行时 数据结构 n 3)在 内存生产java.lang,Class对象,作为 换个类的各种数据访问入口。 n在 Java 中默认提供了三个类加载器,分别是BootstarapClassLoader...
java 载入类的三种方法
载入类的几种方法rnrnrn所有资源都通过ClassLoader载入到JVM里,那么在载入资源时当然可以使用ClassLoader,只是对于不同的资源还可以使用一些别的方式载入,例如对于类可以直接new,对于文件可以直接做IO等。rn载入类的几种方法假设有类A和类B,A在方法amethod里需要实例化B,可能的方法有3种。对于载入类的情况,用户需要知道B类的完整名字(包括包名,例如"com.rai
jvm加载类的顺序
jvm加载有类加载器加载 classloader1.首先看有没有静态的属性,以及静态的代码块 2.顺序加载类3.遇到某个类则加载该类4.如果有父类则加载父类,对于父类先加载静态的属性,以及静态的代码块 然后加载子类的静态的属性,以及静态的代码块,然后父类的代码。。子类的代码...
聊聊JVM——类的加载(一)
前言:nn        最近在看一本《深入理解java虚拟机》的书,在学类加载机制和结合众多大佬的表达并结合自己的理解写下这一篇博客,记录自己的困惑,以防以后忘记。nn nn阅读须知:nn        此次博客以启发性代码和解释进行学习。在阅读时,按照代码和提示进行思考分析为什么,请思考过后在看答案来验证自己的思考。(此博客为个人观点且本人水平有限,如有错,请批评指正)nn  nn小题测试:(...
类从加载到对象实例化的过程顺序
JVM加载类过程:n1.加载:nnn类字节码文件从硬盘读入到内存中类加载器(BootStrapClassLoader,ExtensionClassLoader,SystemClassLoader)加载字节码文件 在方法区存放生成类对应的Class对象nn---------n2.连接n这个过程又包括了:验证、准备、解析nnn验证:对class等进行验证的过程;准备阶段:为静态变
Java执行那些事——类加载机制( 上)
代码编译的结果从本地机器码转换为字节码,是存储格式发展的一小步,却是编程语言发展的一大步。——周志明《深入理解Java虚拟机》nnnnnIntroduction to Class Loadersnn类加载(Class Loaders)是Java运行时(Java Runtime Environment 简称 JRE)的一部分,他负责动态的将字节码从文件形式加载到内存中。正是因为类加载机制的...
由单例模式的优化,引出的java线程数据同步和类加载顺序知识点总结
由单例模式的优化,引出的java线程数据同步和类加载顺序知识点总结n 摘要n n 几种单例模式的优缺点及其改进优化n n DCL失效问题的原因以及解决n n java中线程同步关键字final和volatilen n java内存屏障n n java类加载顺序总结n饿汉单例n //片段1n class Singleton1{n private stat
Java多态时类的加载顺序
问题nnnnpublic class Base {n private String baseName = "base";nn public Base() {n callName();n }nn public void callName() {n System.out.println(baseName);n }nn static cla
类加载的几种方式
概念nn类加载器(ClassLoader),顾名思义,即加载类的东西。在我们使用一个类之前,JVM需要先将该类的字节码文件(.class文件)从磁盘、网络或其他来源加载到内存中,并对字节码进行解析生成对应的Class对象,这就是类加载器的功能。我们可以利用类加载器,实现类的动态加载。nnClass的装载包括3个步骤:加载(loading),连接(link),初始化(initialize)nn加载:
spring boot类加载顺序问题调试
问题描述:nn  在spring boot开发过程中,引入第三方的jar包,第三方第三方包中大概描述:nn@Configurationn@ConditionalOnMissingBean(ServiceFactory.class)n@ConditionalOnProperty(prefix = "wwl.openapi", name = {"url", "appId", "appSecret"})...
jvm之java类加载机制和类加载器(ClassLoader)的详解
     当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化。nn                                                    nn一、类加载过程nn1.加载    nn    加载指的是将类的class文件...
Java 反射与类加载
一 Class对象nn一个类中有属性,方法,构造器等,一个Class对象包含了某个特定类的相关信息,class是描述类的类。nn获取Class对象的三种方式: n1.通过类名获取 类名.class n2.通过对象获取 对象名.getClass() n3.通过全类名获取 Class.forName(全类名)nn二 类加载器nnnn1 概述nn在java中,类型的加载,链接,...
Tomcat目录结构以及类加载顺序
nTomcat是一个优秀的Servlet容器,本身使用java语言编写。Tomcat是Apache开源软件组织的一个软件项目。Tomcat运行稳定、可靠,而且有着开源的优势,Tomcat已成为目前企业开发JavaWeb应用的最佳Servlet容器选择之一。nTomcat的使用很简单,在已配置Java环境的电脑下载解压文件,进入bin目录下启动startup文件,默认端口为8080,访问127.0....
java类什么时候加载?,加载类的原理机制是怎么样的?
java类什么时候加载?,加载类的原理机制是怎么样的?答:很多人都不是很清楚java的class类什么时候加载在运行内存中,其实类加载的时间是发生在一下几种情况:1.实例化对象时,就像spring管理的bean一样,在tomcat启动时就实例化了bean,那么这个对象bean的类就加载了2.通过类名调用静态变量的时候(类名.class除外)jvm加载java类的原理:http://www.yayi...
类的加载时间
所有的类都是在对其第一次使用时,动态的加载到JVM中的。当程序创建第一个对类的静态成员的引用时,就会加载这个类。这个证明构造器也是类的静态方法,即使在构造器之前并没有使用static关键字。因此,使用new操作符创建类的新对象也会被当作对类的静态成员的引用。rn  因此,Java程序在他开始运行之前并非完全加载,其各个部分是在必需时才加载的。这一点与许多传统语言都不同。动态加载使能的行为,在诸如c
Spring自动扫描类的加载顺序
写这篇文章的原因是本地代码运行结果和线上服务器运行结果不一致,类的加载顺序不一样,导致了意想不到的bug,由此展开了对spring自动扫描类的加载机制的探索,先看一下代码,主要涉及到RedissonProperties类和MopFictionTurntableSchedule类。rn代码整体结构如下:rnspring用的4.2版本,本地用jetty7.6.9.v20130131 运行,服务器用re
Java类加载的顺序-包含父子关系
                                                                         Java类加载的顺序-包含父子关系nn首先看一段代码:nnnpublic class TestClassLoader {n static class Father {n public static final String TAG =...
JAVA中关键字Static以及java中类加载顺序
关于关键字static,大家 都知道它是静态的,相当于一个全局变量,也就是这个属性或者方法是可以通过类来访问,当class文件被加载进内存,开始初始化的时候,被static修饰的变量或者方法即被分配了内存,而其他变量是在对象被创建后,才被分配了内存的。rn所以在类中,加载顺序为:(这里是有父类的类的加载顺序):rn1.首先加载父类的静态字段或者静态语句块rn2.子类的静态字段或静态语句块rn3.父
类加载过程
    类的加载就是将class文件中的二进制数据读取到内存中,然后将该字节流所代表的静态数据结构转化为方法区中运行的数据结构,并且在堆内存中生成一个java.lang.Class对象作为访问方法区数据结构的入口nn nn     类加载的最终产物是堆内存中的Class对象,对于同一个ClassLoader来说,无论类被加载多少次,对应带堆内存中的对象始终是同一个,这里所说的加载是类加载过程中的第...
类的加载和初始化的区别
说到类的加载和类的初始化,想必大家都会很迷茫,总是搞不清楚他俩的区别,下面就来说一说他俩的区别:nn类的加载包括类的初始化,类的加载后使用前的最后一个阶段。nn nn类的加载:代表jvm将java文件编译成class文件后,以二进制流的方式存放到运行时数据的方法区中,并在java的堆中创建一个java.lang.Class对象,用来指向存放在方法堆中的数据结构。nn这里给大家推荐一篇java类加载...
[Android]【安卓】【Java】类加载机制和对象加载机制
[Android]【安卓】【Java】类加载机制和对象加载机制nnnn本篇博客已收录到我的安卓开发小结中——点击【安卓开发小结】nnnnME:nnnnOTHERS:nn参考资料一: nJava虚拟机类加载机制nnnnJava虚拟机类加载机制nn看到这个题目,很多人会觉得我写我的java代码,至于类,JVM爱怎么加载就怎么加载,博主有很长一段时间也是这么认为的。随着编程经验的日积月累,越来越感觉到了...
关于java内部类加载顺序的问题
前面是看到某个论坛讨论的内部类加载顺序的问题,链接如下:http://www.oschina.net/question/2273217_217864#tags_navrnrn今天看了单例模式,对内部类的加载顺序产生了疑问。所以来请教大家。rn我们知道,java当中,类的加载顺序是:类静态块-类静态属性-类内部属性-类构造方法。rn但是当有内部类的时候会怎样呢?我们先看一下代码。rnrnrnrn?r
类的加载过程
类的主动引用和被动引用、类加载过程
常用java虚拟机参数(类加载/卸载跟踪)
1,-verbose:class 跟踪类的加载和卸载 n -XX:+TraceClassLoading 跟踪类的加载 n -XX:+TraceClassUnloading 跟踪类的卸载java虚拟机还允许研发人员在运行是打印,查看系统中类的分布情况,只要系统启动时加上 -XX:+PrintClassHistogram参数,然后在java的控制台按下Ctrl+Break组合
文章热词 Java Java教程 Java培训 Java学习 Java价格
相关热词 c# 包含其他exe c++ 包含其他目录头文件 c#中 运算顺序 java和python学习顺序 python学习顺序