企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## **static基本概念:** static 修饰符能够与变量、方法一起使用,表示是“静态”的。 静态变量和静态方法能够通过类名来访问,不需要创建一个类的对象来访问该类的静态成员,所以static修饰的成员又称作类变量和类方法。静态变量与实例变量不同,实例变量总是通过对象来访问,因为它们的值在对象和对象之间有所不同。 请看下面的例子: ``` public class day09static{ static int i = 10; int j; day09static(){ this.j = 20; } public static void main(String [] args){ System.out.println("类变量i = " + day09static.i); day09static de = new day09static(); System.out.println("实例变量j = " + de.j); } } ``` **运行结果:** 类变量i = 10 实例变量j = 20 <br> <br> ## **static 的内存分配** 静态变量属于类,不属于任何独立的对象,所以无需创建类的实例就可以访问静态变量。之所以会产生这样的结果,是因为编译器只为整个类创建了一个静态变量的副本,也就是只分配一个内存空间,虽然有多个实例,但这些实例共享该内存。实例变量则不同,每创建一个对象,都会分配一次内存空间,不同变量的内存相互独立,互不影响,改变 a 对象的实例变量不会影响 b 对象。 ``` public class day10static{ static int i; int j; public static void main(String [] args){ day10static obj1 = new day10static(); obj1.i = 10; obj1.j = 20; day10static obj2 = new day10static(); System.out.println("obj1.i = " + obj1.i + " obj1.j = " + obj1.j); System.out.println("obj2.i = " + obj2.i + " obj2.j = " + obj2.j); } } ``` **运行结果:** obj1.i = 10 obj1.j = 20 obj2.i = 10 obj2.j = 0 :-: ![](https://img.kancloud.cn/df/57/df57d7035e03d6c427f807c7b8a71a2d_539x677.png) 注意:static 的变量是在类装载的时候就会被初始化。也就是说,只要类被装载,不管你是否使用了这个static 变量,它都会被初始化。 小结:类变量(class variables)用关键字 static 修饰,在类加载的时候,分配类变量的内存,以后再生成类的实例对象时,将共享这块内存(类变量),任何一个对象对类变量的修改,都会影响其它对象。外部有两种访问方式:通过对象来访问或通过类名来访问。 ## 静态方法 静态方法是一种不能向对象实施操作的方法。例如,Math 类的 pow() 方法就是一个静态方法,语法为 Math.pow(x, a),用来计算 x 的 a 次幂,在使用时无需创建任何 Math 对象。 因为静态方法不能操作对象,所以不能在静态方法中访问实例变量,只能访问自身类的静态变量。 以下情形可以使用静态方法: * 一个方法不需要访问对象状态,其所需参数都是通过显式参数提供(例如 Math.pow())。 * 一个方法只需要访问类的静态变量。 读者肯定注意到,main() 也是一个静态方法,不对任何对象进行操作。实际上,在程序启动时还没有任何对象,main() 方法是程序的入口,将被执行并创建程序所需的对象。 关于静态变量和静态方法的总结: * 一个类的静态方法只能访问静态变量; * 一个类的静态方法不能够直接调用非静态方法; * 如访问控制权限允许,静态变量和静态方法也可以通过对象来访问,但是不被推荐; * 静态方法中不存在当前对象,因而不能使用 this,当然也不能使用 super; * 静态方法不能被非静态方法覆盖; * 构造方法不允许声明为 static 的; * 局部变量不能使用static修饰。