static 几点要注意的 :
1.在静态方法中是没有this关键字的
2.静态方法只能访问静态的成员变量和静态的成方法
关于第一点,在java中每个类中的非静态方法都有一个隐含的形参,那就是this指针,this指针就是在对象实例化后,保存了实例化对象的地址。
我们发现赋值失败,原因是什么?
我用C++将地址全打印出来,这样可以看的更清楚。
我们可以看到,当构造函数内形参名和类内变量名相同时,会把类内变量屏蔽掉。
形参num,name,age的地址和this指向对象的num,name,age地址不同。也就是被相同变量名屏蔽掉了。
再看下面这张图
当变量没被屏蔽时,num,name,age在形参中没有,所以自动指向类内变量。因此地址相同。
对this还有一点,this指向的是首地址,在这个类内也就对应num的地址。也是类内非静态函数内的隐含形式参数。当对象调用时,自动将指向对象的this指针传入函数。
静态函数为什么没有this指针?
静态随着类的加载而加载到静态区,而this指针只有在对象创建后才存在并且绑定在该对象上。静态比对象创建要早,那么当调用静态方法的时候,对象还没有创建出来,那么自然就没有this指针。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
关于static,
static定义的变量或者方法,存在静态区,是每个对象共有的。
静态方法只能访问静态变量,而不能访问非静态成员。原因同上。静态区变量和方法比非静态区变量和方法生成的早,那么当静态方法调用非静态变量或方法时,非静态变量或方法还没有生成,不存才,因此无法找到,即无法访问。
反过来,如果非静态方法访问静态成员或者方法就没有问题了。
静态区的特点:
1.随着类的加载而加载
2.优先于对象创建
3.在非静态成员函数中可以通过 类名.变量 类名.方法
4.静态只能访问静态
最后附上实例一个