java基础之--static关键字

static关键字的介绍

  • 在类中用static声明的成员变量为静态成员变量,是类的公用变量,在第一次使用时初始化,只初始化一次
  • 用static声明的方法为静态方法,在static方法中不可以访问非静态成员
  • 可以通过对象引用和类名访问静态成员

在一个类里面,每new一个对象,这个对象就有自己的成员变量,但是这些成员变量不是静态的成员变量,对于static成员变量而言,这个成员变量只有一份,而且这一份是这个类所有成员变量的共享。

下面通过代码示例说明:

package com.mlin;

public class Student {
    
    private static int pid = 0;//静态成员变量
    
    private String name;//非静态成员变量
    
    private int id;//非静态成员变量
    
    public Student(String name){
        this.name = name;
        id = pid++;
    }
    
    public void info(){
        System.out.println("id="+id+",name="+name);
    }

    public static void main(String[] args){
        Student.pid = 10;
        Student s1 = new Student("andy");
        Student s2 = new Student("luce");
        
        s1.info();
        s2.info();
        
    }
}

打印结果如下:


java基础之--static关键字_第1张图片
结果

通过代码示例可以看出pid这个静态成员变量被整个类共享,在这里随着对象的增加来增加,有计数功能。
  
这里是new了两个学生出来,这两个学生分别有自己的成员变量name和id,所以这里的id和name都是非静态成员变量,即没有static修饰。但对于静态成员变量来说,不管new了多少个对象,静态成员变量在数据区只有一份。就像上面代码示例中的pid,他只有一份,两个学生对象共享。

静态成员变量是属于整个类的,它不属于专门的某个对象。那么如何访问这个静态成员变量的值呢?
1,任何一个对象都可以访问这个静态的值,访问的都是同一块内存。
2,即便是没有对象也可以访问这个静态的值,通过“类名.静态成员变量名”来访问这个静态的值。

再看下面一个例子:

package com.mlin;

public class Student {
    
    private int pid = 0;//非静态成员变量
    
    private String name;//非静态成员变量
    
    private int id;//非静态成员变量
    
    public Student(String name){
        this.name = name;
        id = pid++;
    }
    
    public void info(){
        System.out.println("id="+id+",name="+name);
    }

    public static void main(String[] args){
        Student s1 = new Student("andy");
        Student s2 = new Student("luce");
        
        s1.info();
        s2.info();
        
    }
}

java基础之--static关键字_第2张图片
结果2

这个例子和第一个例子唯一的区别就是这里的pid不在是静态的成员变量。看结果可以得知两个学生对象的id都是为0,意味着这里的pid并没有改变。因为他是非静态成员变量,每一个new 出来的对象都具有这个pid属性,他不再是类的全局共享,也就是说没new 一个学生对象他就有自己的pid属性,而这个pid属性初始化时就是0,所以两个学生对象的id都是0。

总结

  • 静态方法不再是针对某一个对象来调用,不能访问非静态的成员。

  • 非静态成员专属于某一个对象,访问非静态成员必须new一个对象出来才能访问。

  • 静态的变量可以通过对象名去访问,也可以通过类名去访问,两者访问的都是同一块内存。如上面代码中就是:s1.pid 或 Student.pid

  • 局部变量分配内存永远在栈里面,new出来的东西分配内存永远是在堆里,静态的东西分配内存永远是在数据区。剩下的代码是在代码区

原创作者:凌小样
作品链接:https://www.jianshu.com/p/ea236f8075e3
【原创不易,转载请注明出处,感谢理解】
一位爱生活,爱创作,爱分享,爱自己的90后女程序员一枚,记录工作中的点点滴滴,一起学习,共同进步,期待能和优秀的您交上朋友

你可能感兴趣的:(java基础之--static关键字)