mm.demo=10;
a.demo=10;
b.demo=10;
调用以上三句任意一句,最终所有对象的demo都为10
static 的特点:
-
随着类的加载而被加载;
-
优先于对象存在;
-
被所有对象共享;
-
被 static 所修饰的变量或者方法会储存在数据共享区;
-
被 static 修饰后的成员变量只有一份。
静态变量
被 static 修饰的成员变量叫做静态变量,也叫做类变量,说明这个变量是属于这个类的,而不是属于是对象,没有被static修饰的成员变量叫做实例变量,说明这个变量是属于某个具体的对象的。静态变量可以直接通过类名.静态变量名称调用,虽然也能通过对象来访问静态变量和方法,但为了可读性,方便分辨静态变量,应该通过类名来调用。
例子:
-
public class Person{ static int a = 10; public static void main(String[] args) { System.out.print(Person.a); } } 执行结果: 10
静态变量和实例变量的区别:
-
生命周期的不同; 成员变量随着对象的创建而存在随着对象的回收而释放,静态变量随着类的加载而存在随着类的消失而消失。
-
调用方式不同; 成员变量只能被对象调用,静态变量可以被对象调用,也可以用类名调用。(推荐用类名调用)
-
数据存储位置不同; 成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据,静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。
-
内存中的数量不同。 每次创建对象,都会为每个对象分配成员变量内存空间,实例变量是属于实例对象的,在内存中,创建几次对象,就有几份成员变量。静态变量由于不属于任何实例对象,是属于类的,所以在内存中只会有一份,在类的加载过程中,JVM 为静态变量分配一次内存空间。
静态方法
被 static 修饰的成员方法叫做静态方法,也叫做类方法,静态方法可以直接通过类名.静态方法名称调用(同样也可以用对象.方法的方式),不属于对象的。
-
public class Person{ public static void sleep (){ System.out.print("我要睡觉了"); } public static void main(String[] args) { System.out.print(Person.sleep()); } } 执行结果: 我要睡觉了
要注意的是静态的可以访问静态的,但是不能访问非静态的成员属性和方法,这很好理解,因为 static 修饰的方法是属于类的,如果去直接使用对象的成员变量,它会不知所措(不知该使用哪一个对象的属性)。
静态常量
在 Java 中,final 表示不变,所以用它修饰的量表示常量,例如:
-
final double pi = 3.1415;
在 Java 中,常量一般会用 static 进行修饰,变成静态变量的,这是为什么呢?
在创建类的多个对象时,用 static 修饰的常量在内存中只有一份拷贝。不用 static 修饰,则每创建一个对象会拷贝一份到内存中。