当我们在编写一个类的时候,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或者无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必再每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。
0.说明
- static可以用来修饰:属性、方法、代码块、内部类
1.使用
(1)修饰属性:静态变量
package Static; public class StaticTest { public static void main(String[] args) { Chinese c1=new Chinese(); c1.name="张三"; c1.age=12; Chinese c2=new Chinese(); c2.name="李四"; c2.age=15; c1.nation="CHN"; System.out.println(c2.nation); // CHN } } class Chinese{ String name; int age; static String nation; }
此时,修改c1的static属性nation,c2的nation也会被修改。因此nation是所有子对象的共有的。
因此:属性按是否用static修饰,又分为:静态属性和非静态属性(实例属性)
实例属性:我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。
static修饰属性的其他说明:
- 静态变量随着类的加载而加载
- 静态变量的加载要早于对象的创建
- 由于类只会加载一次,所以静态变量在内存中也只存在一份,存在于方法的静态域中
类变量 | 实例变量 | |
类 | 可直接调用 | 不可以直接调用 |
对象 | 可直接调用 | 可直接调用 |
类变量和实例变量的内存解析
(2)修饰方法(静态方法)
声明:
class Chinese{ String name; int age; static String nation; public static void show() { System.out.println("我是中国人"); } }
使用:
静态方法 | 非静态方法 | |
类 | √ | × |
对象 | √ | √ |
注意:
- 静态方法中,只能调用静态的方法或属性
- 非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性
- 在静态的方法中,不能使用this、super关键字