在所有定义的方法上以及属性上实际上都可以使用static关键字进行定义。
1.static属性
在讲解具体的static操作之前首先来看这样的一个程序
范例:定义一个表示人的类,同时设置他所在的国家
class Person{
private String name;
private int age;
String country="中国";//为了后面的操作方便,暂时不封装
public Person(String name,int age) {
this.name=name;
this.age=age;
}
public String getInfo() {
return "姓名:"+name+",年龄:"+age+",国家:"+country;
}
}
public class TestDemo{
public static void main(String args[]){
Person pe1=new Person("张三",10);
Person pe2=new Person("李四",20);
Person pe3=new Person("王五",30);
pe1.country="大天朝";
System.out.println(pe1.getInfo());
System.out.println(pe2.getInfo());
System.out.println(pe3.getInfo());
}
}//姓名:张三,年龄:10,国家:大天朝
姓名:李四,年龄:20,国家:中国
姓名:王五,年龄:30,国家:中国
那么现在就可以发现传统属性所具备的特征就是保存在堆内存之中,并且每一个对象独享此属性。
可是同样的概念,现在明显不适合与当前的环境,所以最好的做法是将country属性变为一个共享属性,那么只要一次修改就可以影响到所有的对象。那么如果要描述这样的共享属性,则只需要在属性前追加一个static关键字即可
class Person{
private String name;
private int age;
static String country="中国";//为了后面的操作方便,暂时不封装
public Person(String name,int age) {
this.name=name;
this.age=age;
}
public String getInfo() {
return "姓名:"+name+",年龄:"+age+",国家:"+country;
}
}//输出语句略
结果:
姓名:张三,年龄:10,国家:大天朝
姓名:李四,年龄:20,国家:大天朝
姓名:王五,年龄:30,国家:大天朝
★当程序中使用了static关键字进行定义之后,那么此属性将不保存在堆内存之中,会保存在一个全局数据区的内存空间之中。并且所有的对象都可以进行该数据区的访问。
但是现在使用的是共享属性,这个时候的代码就会出现一个问题,共享属性能通过一个对象修改吗?
对于static实际上也会将其称为类属性,而所有的类属性都可以利用类名称直接调用。
结果是一样的。
结论:访问static属性都使用类名称
所有的非static的属性必须产生实例化对象之后才可以使用,而所有static的属性不受实例化对象的限制,也就是说是否有对象与static属性操作无关。
例如:
public static void main(String args[]){
System.out.println(Person.country);
Person.country="大天朝";
System.out.println(Person.country);
}
}
选择:关于static属性与非static属性定义的选择(只有共享或者不想产生对象时才用static)
|-在定义类99%的情况下是不会考虑static属性的;
|-如果需要描述共享属性的概念,或者不希望受到实例化对象控制的时候使用static属性