public class D{
public static void main(String[] args){
A c=new A();
c.print();
}
}
class A{
int a=1;
int b=2;
A(){
this(a,b);
}
A(int a,int b){
this.a=a;
this.b=b;
}
void print(){
System.out.println(a+","+b);
}
}
如果把A类中的ab定义为static的就可以,这又是为什么?
static的成员变量表示是类所有,这个类的所有对象(实例)均共有,任何一个对象改变这个static变量之后,其他对象去取的时候,就取到改变后的。
没有使用static修饰的成员变量是每个对象都有自己专属的一份,只能自己去访问,其他对象访问不了。
理解上面的概念之后,回到楼主的问题上。
有用static修饰a、b,按楼主的写法,会报错,因为拿自己的“专属”的属性来构造自己,是没有意思的。但如果修饰为static,这就不在是专属了,是大家共有。所以你在用static成员变量当参数去构造对象的之前,属性值可能已被改变。而不再是默认的值,这是有意义的。
这就是为什么static的不报错,而非static的报错原因。
还是没清楚,为什么在this(a,b)的时候会出现错误,把ab定义为static的就可以。
你应该这样去想:照你最初的写,a,b是实例对象,意思是你得实例化一个(new创建)A,a,b这两个值才会存在。this(a,b);可以认为是一个全局的函数。
调用了a,b.但是a,b还没在内存中有。而a,b定义为static后,表明是静态变量。是一个类对象。意思是这个类加载的时候,a,b就会实例化,内存会有a,b的对象。所以
可以调用 了
因为static定义的变量是整个class中全局都可以调用的,你的this出错是因为他们找不到a,b
构造函数的作用是什么呢?
就是为了初始化实例的数据域,试问,当调用构造函数时,实例内存中的数据都尚未初始化,当然是会出错的了。
static类型的变量是在类加载的时候就已经初始化完成,所以跟构造函数和实例化无关,所以是好用的。
其实还是初始化顺序的问题。
你理解的“已经定义好的变量”跟计算机理解的不一样的。虽然你定义了a和b并赋了值,但是在真正构造的时候是找不到这个量的,因为非static的变量的初始化要晚于构造函数。而static的就没有问题。其顺序要早于构造函数。
感谢大家的建议和解答。
Cannot refer to an instance field a while explicitly invoking a constructor
不能在调用构造方法的时候用实例变量