[code="java"]class A {
int a = f();
int f() {
return 1;
}
}
class B extends A {
int b = 37;
int f() {
return b;
}
}
public class CtorDemo4 {
public static void main(String args[]) {
B bobj = new B();
System.out.println(bobj.a);
System.out.println(bobj.f());
}
} [/code]
代码如上,
输出:0
37
在我看来,a应该是等于1啊,它不是应该调用的是A类里面的f()方法吗?
本人菜鸟,希望各位多多指点,感激不尽。
class A的方法f没有执行,对象的成员属性如果是int,会给它一个默认值0。引申一下修改了你的原始代码:
[code="java"]class A {
static int a_static = 20 ;
static{
System.out.println("执行A的静态代码块");
System.out.println("class A 输出 a_static---"+a_static);
}
{
System.out.println("执行A的普通代码块");
}
int a = f();
int f() {
System.out.println("f()");
return 1;
}
public A(){
System.out.println("执行A的构造方法");
}
}
class B extends A {
int b = 37;
{
System.out.println("执行B的普通代码块");
}
static int b_static = 10;
static{
System.out.println("执行B的静态代码块");
System.out.println("class B 输出 b_static---"+b_static);
}
int f() {
return b;
}
public B(){
System.out.println("执行B的构造方法");
}
}
public class CtorDemo4 {
public static void main(String args[]) {
B bobj = new B();
System.out.println(bobj.a);
System.out.println(bobj.f());
}
}
[/code]
输出:
执行A的静态代码块
class A 输出 a_static---20
执行B的静态代码块
class B 输出 b_static---10
执行A的普通代码块
执行A的构造方法
执行B的普通代码块
执行B的构造方法
0
37
类中的静态变量和静态代码块,是class级别的变量和代码块,不依赖于类的实例,所以会在构造方法之前进行,也就是在你new对象之前。为了保证类能够正确初始化,非静态代码块会在构造方法进行之前执行。
thinking in java,里面可以解决你所有的疑惑。
Copperfield 的答案很perfect 楼主也可以看看这篇文章 http://www.cnblogs.com/lexus/archive/2011/12/23/2298823.html
楼主,之前没仔细看.中午吃饭突然觉得不对劲.你看看我发的链接,Copperfield的解释有问题, int a = f(); 在A中的实例变量a 的 f()方法执行了,只是被子类的f()方法覆盖了,返回b,b还未初始化,所以返回0 好好看看那篇博客, 希望对你有所帮助