比如:
class A1
{
public static int a=5;
}
class B1 extends A1
{
public static int a=8;
void print(){
System.out.println(super.a);
System.out.println(a);
}
}
class TestStatic
{
public static void main(String args[])
{
System.out.println("b.a="+B1.a);
System.out.println("b.a="+A1.a);
new B1().print();
}
}
class A1
{
public static int a=5;
}
class B1 extends A1
{
public static int a=8;
void print(){
System.out.println(super.a);
System.out.println(a);
}
}
class TestStatic
{
public static void main(String args[])
{
System.out.println("b.a="+B1.a);
System.out.println("b.a="+A1.a);
new B1().print();
}
}
楼主【sure2003】截止到2008-07-26 11:24:18的历史汇总数据(不包括此帖):
发帖的总数量:268 发帖的总分数:11073 每贴平均分数:41
回帖的总数量:231 得分贴总数量:7 回帖的得分率:3%
结贴的总数量:262 结贴的总分数:10863
无满意结贴数:2 无满意结贴分:50
未结的帖子数:6 未结的总分数:210
结贴的百分比:97.76 % 结分的百分比:98.10 %
无满意结贴率:0.76 % 无满意结分率:0.46 %
值得尊敬
这通常是指加载发生于创建类的第一个对象时,但是当访问static域或static 方法时,也会发生加载
就你上面的代码说一下:
当你在doc环境下输入:
java TestStatic时,
虚拟机会先加载TestStatic类,此时虚拟机会先看看TestStatic类有没有静态的字段,
没有,直接执行main方法。
main方法中第一句代码是打印B1.a,
虚拟机便会去找类B1,找到类B1时,虚拟机发现B1的父亲是A1,
于是父亲优先,先加载A1,
同样,在加载A1时,会看看A1中有什么静态的东西,有,
static int a = 5;
a是静态的,先加载,当把静态的字段加载完后,一个类就算加载完了,
所以A1已经加载完毕,以后不用在加载了。
父亲加载完了,轮到B1了,同样先看看里面有什么静态的字段,有,
static int a = 8;
此时B1也加载完毕了。
第一条打印语句到此时也执行完毕了,
轮到第二条打印语句了。
当执行new B1().print();这句时,
会发生动态绑定,
此时会有一个代表B1对象的this对象传递给print()方法,
所以print()方法中的
System.out.println(a);
其实是,
System.out.println(this.a);
会打印出一个8出来。
至于super.a就简单了,
打印父类中的a,
结果是5.
到此,main()方法执行完,整个程序退出。