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) {
}
} 展开
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方法.
当所有静态变量加载完成后,加载静态块.
类的加载和对象的初始化是不一样的.
首先 加载类的时候先加载类的静态成员变量. 因为静态变量依赖类,不依赖对象,先加载
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方法.
当所有静态变量加载完成后,加载静态块.
类的加载和对象的初始化是不一样的.
展开全部
哟西,阿里巴巴笔试题,上次研究了我两天,研究的透透彻彻,网上有很多类加载顺序的资料,在这里说肯定没有人家博客论坛写的清楚,你可以先查查,有一些基础的理解之后再来看下面我写的。
有一点其他地方都没说的但很重要的一点我要先强调:类属性初始化时虚拟机是不会声明属性的同时赋值的,它会把所有属性和方法全部声明完了再从头按代码顺序赋值。如果你有一定水平的话你会发现在new T("t1")的时候会执行print("构造快")而print()方法中用到了还没初始化的i和n,并且值都为0。所以属性是全部声明完之后再按照顺序初始化的。
我给你一个最全的顺序,按这个顺序去分析:
类加载过程(静态属性、静态方法声明-----静态属性赋值、静态块)注意先父类后子类
实例化过程(普通属性、普通方法声明-----普通属性赋值、构造块----构造方法中的代码)也是先父类后子类
如果在类加载过程中调用了实例化过程(如new了本类对象),则会暂停类加载过程先执行实例化过程,执行完毕再回到类加载过程
自己先分析分析,有什么疑问再追问!
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
加载顺序为父类静态块,子类静态块->父类成员变量,父类构造方法->子类成员变量,子类构造方法。因为静态块属于类,在内存中分配好了空间,而且类实例共享的,因此这个创建的优先级高于普通类实例。
追问
按你说的,
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
为什么结果是这个.运行出来的.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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) {
}
}
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) {
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |