Static所修饰的类属性
特点与存储位置
- Static所修饰的属性不属于任何一个类的具体对象而专属于类,但其可被类和对象所调用。
- 它被保存在类方法区,而不是保存在对象的堆区。
代码示例
public class CountObject{
private static int i=0;
CountObject(){
i++;
}
public int getI(){
return i;
}
public static void main(String args[]){
CountObject t=new CountObject();
t=new CountObject();
System.out.println("t.getI()");
}
}
- 最后的输出结果为2的原因:
- 在第一次创建对象的时候,立即调用了构造方法CountObject(),此时i++,i=1
- 执行t=new CountObject()时,给t这个对象引用进行了“刷新”,此时再次调用构造方法CountObject(),此时i++,i=2
- 最后调用getI()方法,输出结果2
- 这个结果表明Static存储位置与对象存储位置不同,不受对象的改变而改变
Static所修饰的类方法
特点与存储位置
- Static所修饰的类方法也不属于任何一个类的具体对象而专属于类,但其可被类和对象所调用
- Static 方法内部的代码只能访问类中的Static属性或方法,不能访问非Static的属性和方法,但非Static的属性和方法可以访问Static的属性和方法
- main方法是特殊静态的方法
- 也被保存在类方法区,而不是保存在对象的堆区
代码示例
public class AccessValue{
int value;
public static void main(String args[]){
System.out.println(value);
}
}
此程序将报错,因为main方法属于静态方法无法调用非静态属性
静态代码块
代码示例
public class StaticCodeBlocks{
static int value;
static{
value = 3;
Syestem.out.println(value);
}
public static void main(String args[]){
}
}
结果输出为3
解析
此代码为静态代码块
static{
value = 3;
Syestem.out.println(value);
}
- 不含任何方法,当类被装载时,只被执行一次
- 经常被用来对类中的属性进行初始化