class Person{
……
static string country = "cn";
}
class StaticDemo{
public static void main(String[] args){
//Person p = new Person();
//System.out.println(p.country);
System.out.println(Person.country);
}
}
当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调用。 类名.静态成员 Person.country
static 特点: 1 随着类的加载而加载,就是说,静态会随着类的消失而消失。说明它的生命周期最长(静态代码块static{}优先于主函数执行,执行一次)
2 优先于对象存在,静态是先存在,对象是后存在的。
3 被所有的对象所共享
4 可以直接被类名所调用
实例变量和类变量的区别:
1. 存放位置:类变量随着类的加载而存放在方法区中,实例变量随着对象的建立而存放在堆内存中
2. 生命周期:类变量 生命周期最长,随着类的消失而消失。实例变量生命周期随着对象的消失而消失。
静态使用注意事项:
1 静态方法只能访问静态成员(包括方法、变量)
非静态方法既可以访问静态也可以访问非静态
2 静态方法中可以不定义this super 关键字 因为静态优于对象存在。
3 主函数是 静态的。
静态有利有弊:
利:对对象的共享数据进行单独空间的存储,节省空间。没有必要每个对象中都存储一份。可以直接被类名调用。
弊:生命周期过长。 访问出现局限性。(静态虽好,只能访问静态)
静态的应用。
有时每一个方法,都没用到ArrayTool对象中特有的数据,此时是不需要对象的。
将ArrayTool中的方法都定义成static的,直接通过类名调用即可。
将方法定义成静态之后,可以方便使用。但是该类还是可以被其他程序简历对象(占内存)。为了更严谨,强制让该类不能建立对象。可以通过将构造函数私有化。
class ArrayTool{
private ArrayTool(){}
<span style="white-space:pre"> </span>public static int geeMax(int[] arr){
<span style="white-space:pre"> </span>int max = 0;
<span style="white-space:pre"> </span>for(int x=1;x<arr.length;x++){
<span style="white-space:pre"> </span>if(arr[x]>arr[max])
<span style="white-space:pre"> </span>max = x;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>.....
}