static主要应用于修饰被很多对象共享的属性,比如所属城市属性,国家属性。
某城市更名后为了不至于所有的对象一个个修改城市属性,所以把该属性设置为全局属性(静态属性)。
不过作为大家共享的公共属性由一个对象来修改很明显是不合理的,一般情况下直接用类名对其调用。(static声明的属性又称作类属性)
这类全局属性和全局方法用static进行修饰。
Java中主要分为4块内存空间,栈内存保存所有对象的名称,堆内存保存对象的具体属性内容,全局数据区保存static类型的属性,全局代码区保存所有的方法定义。
在前面经常会用到在主类中,main方法中会调用的方法前面都有static修饰。这是因为static方法是不能调用非static声明的属性和方法。而非static声明的方法可以调用static声明的属性和方法。
这样考虑:程序中类的属性和方法需要在对象开辟堆内存之后才能调用,而static类型的方法在对象未被实例化时就可以被调用了。
因此,能够被主方法调用的方法必须用static进行修饰。毕竟静态方法是不能调用非静态方法的。
由于static属性是所有对象共享的,则可以应用static属性统计一个类到底生成了多少个对象。也可以对自动生成的对象自动编号命名。
class Demo{
private String name;
public static int countUnnaming = 0;
public static int count = 0;
public Demo(){
count++;
countUnnaming++;
this.name = "Unnaming-No."+countUnnaming;
}
public Demo(String name){
count++;
this.name = name;
}
public String getName(){
return this.name;
}
}
public class HelloWorld{
public static void main(String []args){
System.out.println(new Demo().getName());
System.out.println(new Demo("FangXy").getName());
System.out.println(new Demo().getName());
System.out.println(new Demo("FuXs").getName());
System.out.println(new Demo().getName());
System.out.println("There are "+Demo.count+" objects has been generated!");
}
}