static的基本作用是:
方便在没有创建对象的时候调用(属性/方法)
先看一道例题:
Math类中定义常量PI并赋值,定义方法pi()输出π
public class Math {
public final double PI = 3.1415926;
public void pi(){System.out.println("3.1416926"); }
}
这时候主函数想要调用Math类中的属性或方法,首先要实例化一个该类对象来产生实例域中的值,并用对象调取实例域中的值。
public static void main(String[] args) {
Math math = new Math();
System.out.println(math.PI);
math.pi();}
而用static修饰属性/方法,这时会为给属性/设置一个静态域来存放其值。这个静态域又叫类域,属于类当类创建时自动产生,而与对象无关。
public class Math {
public static final double PI = 3.1415926;}
此时可以直接用类名调用属性的值。
public static void main(String[] args) {
System.out.println(Math.PI);
Math.pi();}
有了这个例子我们就很好理解:
对于常量而言,static只有一个副本只会在类首次加载的时候初始化
省略static后每一个对象都会有该变量的拷贝。
对于方法而言,可以认为static是没有this参数(隐式参数)的方法。这下我们也就知道了为什么main方法中有static,因为我们是执行main方法的时候并没有创建对象,因此我们只能用类名来调用。
注意
1.在静态方法中不能访问类的非静态成员变量和方法即(静态只能调用静态)
2.static不支持来修饰局部变量(局部变量有生命周期,执行完后java无法自动回收内存)