java类加载问题。不要告诉我结果,我问的是为什么会是这样的结果,加载顺序是什么?

packagetest;publicclassTimplementsCloneable{publicstaticintk=0;publicstaticTt1=newT("... package test;

public class T implements Cloneable {
public static int k = 0;
public static T t1 = new T("t1");
public static T t2 = new T("t2");
public static int i = print("i");
public static int n = 99;

public int j = print("j");

{
print("构造快");
}

static {
print("静态块");
}

public T(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++n;
++i;
}

public static int print(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++n;
return ++i;
}

public static void main(String[] args) {

}
}
展开
 我来答
匿名用户
2013-11-11
展开全部
加载类、 静态成员变量初始化、 静态代码块、非静态成员变量初始化、 构造方法;
首先 加载类的时候先加载类的静态成员变量. 因为静态变量依赖类,不依赖对象,先加载
public static int k = 0;
public static T t1 = new T("t1"); 加载到这一行的时候就会new一个对象出来,并执行public int j = print("j"); 因为j是成员变量,依赖对象.
所以在对象初始化的时候才加载. 然后加载非静态的构造块 构造方法. t2静态变量同理.
t1 t2加载的时候,i n 并未初始化.因为静态变量i , n 在静态变量t1,t2后,所以i, n 就为0开始.
public static int i = print("i"); 加载到静态变量i时,执行print方法.
当所有静态变量加载完成后,加载静态块.
类的加载和对象的初始化是不一样的.
ROBOT________
推荐于2017-11-28
知道答主
回答量:31
采纳率:100%
帮助的人:9.6万
展开全部

  哟西,阿里巴巴笔试题,上次研究了我两天,研究的透透彻彻,网上有很多类加载顺序的资料,在这里说肯定没有人家博客论坛写的清楚,你可以先查查,有一些基础的理解之后再来看下面我写的。

  有一点其他地方都没说的但很重要的一点我要先强调:类属性初始化时虚拟机是不会声明属性的同时赋值的,它会把所有属性和方法全部声明完了再从头按代码顺序赋值。如果你有一定水平的话你会发现在new T("t1")的时候会执行print("构造快")而print()方法中用到了还没初始化的i和n,并且值都为0。所以属性是全部声明完之后再按照顺序初始化的。

  我给你一个最全的顺序,按这个顺序去分析:

  1. 类加载过程(静态属性、静态方法声明-----静态属性赋值、静态块)注意先父类后子类

  2. 实例化过程(普通属性、普通方法声明-----普通属性赋值、构造块----构造方法中的代码)也是先父类后子类

  3. 如果在类加载过程中调用了实例化过程(如new了本类对象),则会暂停类加载过程先执行实例化过程,执行完毕再回到类加载过程

  自己先分析分析,有什么疑问再追问!

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
明敏cslg
2013-11-10 · TA获得超过1646个赞
知道小有建树答主
回答量:224
采纳率:0%
帮助的人:154万
展开全部
加载顺序为父类静态块,子类静态块->父类成员变量,父类构造方法->子类成员变量,子类构造方法。因为静态块属于类,在内存中分配好了空间,而且类实例共享的,因此这个创建的优先级高于普通类实例。
追问
按你说的,
1:j i=0 n=0
2:构造快 i=1 n=1
3:t1 i=2 n=2
4:j i=3 n=3
5:构造快 i=4 n=4
6:t2 i=5 n=5
7:i i=6 n=6
8:静态块 i=7 n=99
为什么结果是这个.运行出来的.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
王学伟杰伦
2017-11-28
知道答主
回答量:2
采纳率:0%
帮助的人:1.6万
展开全部
public class ClassOrder {
public static int k = 0;// 1.静态成员变量先全部声明再挨个赋值
public static ClassOrder t1 = new ClassOrder("t1");
public static ClassOrder t2 = new ClassOrder("t2");
public static int i = print("i");
public static int n = 99;

private int a = 0;

public int j = print("j");// 2.声明对象时,先加载成员变量

{
print("构造块");// 3.再加载构造块(其实就是按顺序执行)
}

static {
print("静态块");// 5.成员变量与块按顺序执行
}

// 4.最后加载构造函数
public ClassOrder(String str) {
System.out.println("我是构造函数"+(++k)+":"+str+" i="+i+" n="+n);
++i;++n;
}

public static int print(String str) {
System.out.println((++k)+":"+str+" i="+i+" n="+n);
++n;
return ++i;
}

public static void main(String[] args) {

}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式