class A {
public A() {
init();
}
public void init() {
}
}
public class B extends A {
int i;
int s=1;
public void init(){
i = 100;
s = 100;
}
public void println() {
System.out.println(i);
System.out.println(s);
}
public static void main(String[] arg) {
new B().println();
}
}
执行结果是:
100
1
public A() {
init();
}
public void init() {
}
}
public class B extends A {
int i;
int s=1;
public void init(){
i = 100;
s = 100;
}
public void println() {
System.out.println(i);
System.out.println(s);
}
public static void main(String[] arg) {
new B().println();
}
}
执行结果是:
100
1
public A() {
init();
}
public void init() {
}
}
public class B extends A {
int i;
int s=1;
public void init(){
i = 100;
s = 100;
}
public void println() {
System.out.println(i);
System.out.println(s);
}
public static void main(String[] arg) {
new B().println();
}
}
先public A() s和i得到100;
然后,s再赋值为1
class A {
public A() {
init();
} public void init() {
System.out.println("AAAAAAAAAAA");
}
}public class B extends A {
int i;
int s = 1; public void init() {
i = 100;
s = 100;
System.out.println("BBBBBBBBBBBB");
} public void println() {
System.out.println(i);
System.out.println(s);
} public static void main(String[] arg) {
new B().println();
}
}我想你运行一下上面这个程序,可能会更明白一点。 B类因为继承了A类,并且重写了A类的一个方法。所以B类在运行时,会先调用A类的构造函数。A类的构造函数中调用Int()方法,这个方法被B数重写,它不会调用自己类里面的哪个Int(),而是调用B中的Int,这样就行到I=100,B类在初始化时没有指定构造函数,它会用默认的构造函数,并且初始化全局变量,因为I没有指定值,但在A类调用时给了一个值,所以JVM 不会再给它指定值。这大概就是你所得结果的原因,如果有胡说的地方请大家指证
子类中 init
子类中 println
执行过程
但是为什么呢
int s=1;
等价于
int i;
int s;
{s=1;} 顺序
父类动态块: 无
父类构造函数: 调被override过的init()
子类动态块:{ s=1; }
子类构造函数: 无
明白了吧
{
i=100;
s=100;
}
把i,s均赋值,再执行int i,s=1。