标题: 关于初始化块的问题 [打印本页] 作者: 贾振凯 时间: 2013-3-6 18:17 标题: 关于初始化块的问题 public class SubClass {
int age = 2; //先声明实例属性并初始化
{
age = 5;
System.out.println(age); //此处不需要this进行点取
}
}
public class SubClass {
{
age = 5; //此处怎样都OK
System.out.println(this.age); //此处需要this进行点取,为什么?
}
int age = 2; //后声明实例属性并初始化
} 作者: scott0610 时间: 2013-3-6 19:25
Java的执行过程是从上往下依次执行。静态代码和属性其实质都会放在构造函数中执行。这个可使用javap -c 类名。来分解方法代码,也就是显示每个方法具体的字节码。这样就很容易明白。作者: 张宁 时间: 2013-3-6 20:20
public class SubClass {
int age = 2; //先声明实例属性并初始化
{
age = 5;
System.out.println(age); //此处不需要this进行点取
}
}
public class SubClass {
{
age = 5; //此处怎样都OK
System.out.println(this.age); //此处需要this进行点取,为什么?
}
int age = 2; //后声明实例属性并初始化
}
复制代码
类的成员变量在构造方法调用之前就已经初始化,因为代码的执行是从上往下,当执行到System.out.println(this.age);如果不加this,则视为age没有定义。加了this后相当于先调用构造方法,然后再调用它的age属性。此时就可以找到age了。你那个age=5那叫定义么?没有类型,执行这个肯定提示没定义么。定义必须加类型修饰。这个里面执行到system时就编译失败。此时它就找不到age的类型。它看不到后面的int age =2
不是在显示初始化之前就先分配内存并默认初始化了吗?
依稀记得
public class SubClass {
{
age = 5;
System.out.println(this.age);
}
int age = 2;
}
等同于
public class SubClass {
int age;
{
System.out.println(this.age);
}
public SubClass(){
age = 5;
age = 2;
}
}