概述
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