TOC
一、static可以修饰的结构
- 属性、方法;代码块、内部类;
1.static修饰属性
①.静态变量:类中的属性使用static进行修饰
对比静态变量与实例变量
-
个数:
静态变量:在内存中只有一份,被类的多个对象所共享
实例变量:类的每一个实例(或对象)都保存着一份实例变量 -
内存位置:
静态变量:jdk6及之前,存放在方法区;jdk7及以后,存放在堆空间
实例变量:存放在堆空间的对象实体中 -
加载时机:
静态变量:随着类的加载而加载,由于类只会加载一次,所以静态变量也只有一份
实例变量:随着对象的创建而创建。每个对象拥有一份实例变量 -
调用者:
静态变量:可以被类直接调用,也可以使用对象调用。
实例变量:只能使用对象进行调用 -
消亡时机:
静态变量:随着类的卸载而消亡
实例变量:随着对象的消亡而消亡
2.static修饰方法:(类方法、静态方法)
- 随着类的加载而加载
- 可以通过类名.方法名的形式来调用
- 静态方法只能调用静态的属性和静态的方法(属性和方法的前缀是当前类,可以省略),不能调用非静态的结构
- 非静态方法可以调用静态的方法或属性
- static修饰的方法内,不能使用this和super
二、开发中,什么时候需要将属性声明为静态的?
-
判断当前类的多个实例是否能够共享此成员变量,且此成员变量的值是相同的。
-
开发中,常将一些常量声明是静态的,比如,Math类中的PI
三、开发中,什么时候需要将方法声明为静态的?
- 方法内操作的变量如果都是静态变量(而非实例变量)的话,则此方法建议声明为静态的方法
- 常常将工具类中的方法,声明为静态方法。比如Arrays类、Math类