Static
修饰符 static
-
针对一个类所有对象的共性属性,JAVA采用static成员完成统一调用。
-
static在变量或者方法之前,表明它们是属于类的,称为类方法(静态方法)或者类变量(静态变量)。若无static修饰,则是实例方法(可以通过对象“.”来调用)和实例变量。
-
和类的其他成员属性不同,static成员并不是存放在对象对应的堆空间中。而是将static成员存放在方法区中,每个对象的相应static共享一段内存。
修饰类
public class T1{
//修饰类
static t1_1{
}
}
修饰方法
- 在成员方法前加static关键字,可以将其声明为静态成员方法
- 静态成员方法只能对方法自生的局部变量或者类的静态成员变量进行操作(可以见以下例子)
- 静态成员方法没有this引用
- 和静态成员变量一样,可以通过类名或者对象访问静态成员方法(建议使用类名)
修饰属性
- 可以将static和final联合起来使用
- 当一个变量被static和final共同修饰时,其和仅用static修饰的变量的差异在于声明时必须初始化,而且在整个程序生命周期内不能再对这个变量进行二次赋值
- static final常量通常用于保存整个应用程序共享的常量值
- staticimport也可以使用通配符,如:import static java.lang.Math.*表示导入Math类中的所有的静态成员。
举一个例子
package demo3;
import com.sun.javafx.animation.TickCalculation;
public class test_static {
public static void main(String[] args) {
// TODO Auto-generated method stub
T1 t1=new T1();
T1 t2=new T1();
//静态属性属于类,"所有对象"共享该成员变量
//调用属性可以:对象名.属性名 或者 类名.属性名
System.out.println("***静态属性**********************");
System.out.println(t1.a);
System.out.println(t1.a--);
System.out.println(t1.a);
System.out.println("***\"所有对象\"共享该成员变量********");
System.out.println(t2.a);
System.out.println(t2.a--);
System.out.println(t2.a);
System.out.println("***\"所有对象\"共享该成员变量********");
//非静态属性,每个对象使用一份
System.out.println("***非静态属性*********************");
System.out.println(t1.b);
System.out.println(t1.b--);
System.out.println(t1.b);
System.out.println("************");
System.out.println(t2.b);
System.out.println(t2.b--);
System.out.println(t2.b);
System.out.println("************");
//调用方法可以:对象名.方法名 或者 类名.方法名
T1.t1_1();
t1.t1_1();
t1.t1_2();
}
}
class T1{
static int a=7;//静态成员变量
public int b=3;
//静态方法:无法直接访问实例方法,可以通过创建对象来调用
public static void t1_1() {
T1 tiT1=new T1();
// 静态成员方法只能对方法自生的局部变量或者类的静态成员变量进行操作
System.out.println(a);
//报错:Cannot make a static reference to the non-static field b
//静态方法里面不能直接调用类里面的属性,可以通过创建对象来调用
//System.out.println(b);
System.out.println(tiT1.b);
//报错:Cannot make a static reference to the non-static method t1_2() from the type T1
//同理
//t1_2();
tiT1.t1_2();
}
//实例方法:可以直接调用静态方法
public void t1_2() {
System.out.println(a);
System.out.println(b);
t1_1();
}
}
运行结果:后面会一直运行下去