Java-static

static关键字
在类中,用static声明的成员变量为静态成员变量,也成为类变量。类变量的生命周期和类相同,在整个应用程序执行期间都有效。

  • static修饰的成员变量和方法 属于类 存储在方法区中,一份
  • 普通变量和方法从属于对象
  • 静态方法不能调用非静态成员,编译会报错

static关键字的用途
一句话描述就是:方便在没有创建对象的情况下进行调用方法和变量。
显然被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。
static可以用来修饰类的成员方法、类的成员变量,另外也可以编写static代码块来优化程序性能
static变量

演示静态变量

class Loo{
    int a;
    static int b;
    Loo(){
        a++;
        b++;
    }
    void show(){
        System.out.println("a="+a+",b="+b);
    }
}

public class StaticDemo {
    public static void main(String[] args) {
        Loo o1 = new Loo();
        o1.show();
        Loo o2 = new Loo();
        o2.show();
        Loo o3 = new Loo();
        o3.show();
        System.out.println(Loo.b); //常常通过类名点来访问
    }
}

static方法
static方法也成为静态方法,由于静态方法不依赖于任何对象就可以直接访问,因此对于静态方法来说,是没有this的,因为不依附于任何对象,既然都没有对象,就谈不上this了,并且由于此特性,在静态方法中不能访问类的非静态成员变量和非静态方法,因为非静态成员变量和非静态方法都必须依赖于具体的对象才能被调用。
虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法和静态成员变量。

演示静态方法

class Moo{
    int a; //实例变量(对象来访问)
    static int b; //静态变量(类名来访问)
    void show(){ //有隐式this
        System.out.println(this.a);
        System.out.println(Moo.b);
    }
    static void test(){ //没有隐式this
        //静态方法中没有隐式this传递
        //没有this就意味着没有对象
        //而实例成员a必须通过对象来访问
        //所以如下语句会发生编译错误
        //System.out.println(a); //编译错误
        System.out.println(Moo.b);
    }
}

演示静态方法的应用场景

class Noo{
    int a; //实例变量---描述对象的属性
    //show()方法中需要访问对象的属性a,说明show()的操作与对象有关---不能静态方法
    void show(){
        System.out.println(a);
    }
    //plus()方法中不需要访问对象的属性和行为,说明plus()的操作与对象无关-可以静态方法
    static void plus(int num1,int num2){
        int num=num1+num2;
        System.out.println(num);
    }
}
public class StaticDemo {
    public static void main(String[] args) {
        Noo.plus(5,7); //常常通过类名点来访问
    }
}

static块
属于类,在类被加载时自动执行,因为一个类只被加载一次,所以静态块也只执行一次

class Poo{
    static{
        System.out.println("静态块");
    }
    Poo(){
        System.out.println("构造方法");
    }
}
public class StaticDemo {
    public static void main(String[] args) {
        Poo o4 = new Poo();
        Poo o5 = new Poo();
    }
}

补充

  1. 成员变量分两种:

    • 实例变量:没有static修饰,属于对象的,存储在堆中,有几个对象就有几份
      ​ 通过对象/引用打点来访问

    • 静态变量:有static修饰,属于类的,存储在方法区中,只有一份
      ​ 常常通过类名点来访问

  2. 内存管理:由JVM来管理的

    • 堆:new出来的对象(包括实例变量、数组的元素)
    • 栈:局部变量(包括方法的参数)
    • 方法区:.class字节码文件(包括静态变量、所有方法)
posted @ 2022-07-14 19:50  自带光环的宇  阅读(70)  评论(0)    收藏  举报