第七十二课.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);

 

         }

}

这样就完美不报错了

猜你喜欢

转载自blog.csdn.net/qq_41917908/article/details/88200365