JAVA static关键字

概述

static 修饰符 修饰 成员变量,称为 静态变量(类变量,类属性);
修饰 常量,称为 静态常量 ;
修饰 成员方法 ,称为 静态方法

静态变量、静态常量、静态方法, 归整个类所有,不依赖于类的 实例,被类的所有实例共享。

只要这个类被加载,就可以通过类名使用

静态变量

静态变量 与 实例变量 区别

对于静态变量,运行时,Java 虚拟机只为静态变量分配一次内存,在加载类的过程中完成静态变量的内存分配。在类的内部,可以在任何方法内直接访问静态变量;在其他类中,可以通过类名访问该类中的静态变量。

对于实例变量,每创建一个实例,Java 虚拟机就会为实例变量分配一次内存。在类的内部,可以在非静态方法中直接访问实例变量;在本类的静态方法或其他类中则需要通过类的实例对象进行访问。

静态变量 的作用

静态变量可以 被 类的所有对象 共享,因此静态变量可以作为 实例之间的共享数据,增加实例之间的交互性。

例 1
创建一个带静态变量的类,然后在 main() 方法中访问该变量并输出结果。

public class XiaoMiPhone {
    static String logo="xiaomi";
    /*
    每个对象的cpu可能是不同的
     */
    String cpu;
}

访问

可通过 类名访问、修改,也可以通过 实例 访问、修改

public class s3static关键字 {


    public static void main(String[] args) {
        //通过 类名.静态属性
//        System.out.println(XiaoMiPhone.logo);

        XiaoMiPhone xiaomi11=new XiaoMiPhone();
        xiaomi11.cpu="骁龙888";
        XiaoMiPhone k40=new XiaoMiPhone();
        k40.cpu="骁龙870";

        System.out.println("小米11的logo:"+xiaomi11.logo);
        System.out.println("小米11的cpu:"+xiaomi11.cpu);
        System.out.println("k40的logo:"+k40.logo);
        System.out.println("k40的cpu:"+k40.cpu);

        //对静态属性重新赋值
        XiaoMiPhone.logo="xiaomi升级版";

        System.out.println("修改后================");

        System.out.println("小米11的logo:"+xiaomi11.logo);
        System.out.println("小米11的cpu:"+xiaomi11.cpu);
        System.out.println("k40的logo:"+k40.logo);
        System.out.println("k40的cpu:"+k40.cpu);
    }

}

执行结果:

小米11的logo:xiaomi
小米11的cpu:骁龙888
k40的logo:xiaomi
k40的cpu:骁龙870
修改后================
小米11的logo:xiaomi升级版
小米11的cpu:骁龙888
k40的logo:xiaomi升级版
k40的cpu:骁龙870

从运行结果可以看出,在类中定义静态成员变量,在 main() 方法中可以直接访问,也可以通过 类名访问,还可以通过 类的对象访问。

静态常量

如果类的所有实例都包含一个相同的常量属性,则可以把这个属性定义为 静态常量,从而节省内存空间。例如,在类中定义一个静态常量 PI。

public class Test{
    public static final double PI = 3.1415;
}

PI是常量,不可改变

static 不能修饰局部变量

静态方法

静态方法 与 实例方法的区别

静态方法

  • 静态方法 通过 类名 就可以被调用

  • 不能使用 this 关键字,也 不能直接访问 所属类的 实例变量 和 实例方法

  • 不能使用 super 关键字 (super 关键字 与类的特定实例相关)

  • 可以直接 访问所属类的 静态变量 和 静态方法。

实例方法

  • 在实例方法中 可以直接访问 所属类的 静态变量、静态方法、实例变量和实例方法。

例子

创建一个带静态变量的类,添加几个静态方法对静态变量的值进行修改,然后在 main() 方法中调用静态方法并输出结果。

public class StaticMethod {
    public static int count = 1;    // 定义静态变量count
    public int method1() {    
        // 实例方法method1
        count++;    // 访问静态变量count并赋值
        System.out.println("在静态方法 method1()中的 count="+count);    // 打印count
        return count;
    }
    public static int method2() {    
        // 静态方法method2
        count += count;    // 访问静态变量count并赋值
        System.out.println("在静态方法 method2()中的 count="+count);    // 打印count
        return count;
    }
    public static void PrintCount() {    
        // 静态方法PrintCount
        count += 2;
        System.out.println("在静态方法 PrintCount()中的 count="+count);    // 打印count
    }
    public static void main(String[] args) {
        StaticMethod sft = new StaticMethod();
        // 通过实例对象调用实例方法
        System.out.println("method1() 方法返回值 intro1="+sft.method1());
        // 直接调用静态方法
        System.out.println("method2() 方法返回值 intro1="+method2());
        // 通过类名调用静态方法,打印 count
        StaticMethod.PrintCount();
    }
}

执行结果如下:

在静态方法 method1()中的 count=2
method1() 方法返回值 intro1=2
在静态方法 method2()中的 count=4
method2() 方法返回值 intro1=4
在静态方法 PrintCount()中的 count=6

在该程序中,静态变量 count 作为实例之间的共享数据,因此在不同的方法中调用 count,值是不一样的。从该程序中可以看出,在静态方法 method1() 和 PrintCount() 中是不可以调用非静态方法 method1() 的,而在 method1() 方法中可以调用静态方法 method2() 和 PrintCount()。

在 静态方法中,访问 非静态方法 时,需要通过实例对象来访问,而在访问静态方法时,可以直接访问,也可以通过类名来访问,还可以通过实例化对象来访问。

静态代码块

参见 https://www.malaoshi.top/show_1EF4rbaqehkY.html


原文出处:/show_1EF4rbNmoikV.html