小鱼Ava
2017-12-20 06:23
采纳率: 60%
浏览 1.3k
已采纳

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类。。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

10条回答 默认 最新

  • yuyubingMan 2017-12-20 14:16
    已采纳

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

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

    点赞 打赏 评论
  • hzxt 2017-12-20 06:28

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

    点赞 打赏 评论
  • detoAndy 2017-12-20 06:30

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

    点赞 打赏 评论
  • 敲代码耽误的厨子 2017-12-20 06:52

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

    点赞 打赏 评论
  • 黑化肥挥发会发灰 2017-12-20 07:02

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

    点赞 打赏 评论
  • zzzquddn 2017-12-20 07:31

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

    点赞 打赏 评论
  • huhuhuHR 2017-12-20 07:41

    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有这么一句话:当一个程序创建第一个对类的静态成员的引用时,就会加载这个类。构造器是类的静态方法。

    点赞 打赏 评论
  • 逗比123号 2017-12-20 07:49

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

    点赞 打赏 评论
  • wagfuubin 2017-12-20 13:25

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

    点赞 打赏 评论
  • L_wine 2017-12-20 13:57

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

    点赞 打赏 评论

相关推荐 更多相似问题