第七十二课.static关键字-1
静态:static
用法:是一个修饰符,用于修饰成员(成员变量,成员函数),
当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调:类名.静态成员
类名.静态成员
存在:方法区,共享区,数据区(非堆内存、栈内存的另一个存储区),Static 块仅在该类被加载时执行一次。
static特点:
1,随着类的加载而加载,也就是说静态会随着类的消失而消失,说明他的生命周期最长
2,优先于对象的存在。(静态先存在,对象后存在。)
3,被所有对象所共享
4,可以直接被类名调用
由于静态static不依赖于任何对象就可以进行访问,因此对于静态来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
内部类中不能存在static修饰的成员,因为static随着类加载产生,内部类依附于宿主类,系统加载:宿主类-->静态-->内部类,而内部类的静态是随着内部类加载产生,与加载类就加载static矛盾,所以内部类中不能存在static修饰
例:
package com.xuenixiang.web;
public class Vip {
public int vip1;
public static int vip2;
}
package com.xuenixiang.web;
public class ChongZhiVip {
public static void main(String[] args) {
// TODO 自动生成的方法存根
com.xuenixiang.web.Vip xnx1=new com.xuenixiang.web.Vip();
xnx1.vip1=100;
xnx1.vip2=100;
com.xuenixiang.web.Vip xnx2=new com.xuenixiang.web.Vip();
xnx2.vip1=200;
xnx2.vip2=200;
System.out.println("对象xnx1的成员属性vip1的值为:"+xnx1.vip1);
System.out.println("对象xnx1的成员属性vip2的值为:"+xnx1.vip2);
System.out.println("对象xnx2的成员属性vip1的值为:"+xnx2.vip1);
System.out.println("对象xnx2的成员属性vip2的值为:"+xnx2.vip2);
}
}
运行结果:
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。 被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
如果引用了对象,编译器会提示,但不会报错,如下图所示:
所以程序可以改进一下:
package com.xuenixiang.web;
public class ChongZhiVip {
public static void main(String[] args) {
// TODO 自动生成的方法存根
com.xuenixiang.web.Vip xnx1=new com.xuenixiang.web.Vip();
xnx1.vip1=100;
Vip.vip2=100;
com.xuenixiang.web.Vip xnx2=new com.xuenixiang.web.Vip();
xnx2.vip1=200;
Vip.vip2=200;
System.out.println("对象xnx1的成员属性vip1的值为:"+xnx1.vip1);
System.out.println("对象xnx1的成员属性vip2的值为:"+Vip.vip2);
System.out.println("对象xnx2的成员属性vip1的值为:"+xnx2.vip1);
System.out.println("对象xnx2的成员属性vip2的值为:"+Vip.vip2);
}
}
这样就完美不报错了