理解Static关键字
基本使用
public class StaticTest {
public static int staticVar=0;
public int instanceVar=0;
public void Speak(){
System.out.println(instanceVar);
}
static void Speak2(){
System.out.println(staticVar);
}
public static void main(String[] args) {
StaticTest st=new StaticTest();
System.out.println(staticVar);
System.out.println(st.instanceVar);
st.Speak();
Speak2();
}
}
在语法定义上的区别:静态变量前要加static关键字,而实例变量则不加
在程序运行时的区别:实例变量属于某个对象的属性,必须穿件了实例对象,其中的实例变量才会被分配空间,才能使用实例变量。静态变量不属于某个实例对象,而是属于类,所以也被称为类变量,只需要程序加载了这个类该静态变量就被分配了空间,静态变量就可以使用。.
注意:不可以从一个static方法内部发起对非static方法的调用,因为方法与对象无关,或者说static方法是在类引入后出现,此时没有对象,在没有对象的情况下无法调用需要对象才分配空间的非static方法。
深入理解
Static修饰的变量被称为类变量,类变量具有以下的特征:
-
类变量也称为静态变量,在类中以 static 关键字声明,但必须在方法之外,在方法内声明会报错。
-
无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。
public class StaticTest {
public static int staticVar=0;
public int instanceVar=0;
public StaticTest(){
staticVar++;
instanceVar++;
System.out.println("静态变量:"+staticVar);
System.out.println("动态变量:"+instanceVar);
}
}
public class StaticTest2 {
public static void main(String[] args) {
StaticTest staticTest1=new StaticTest();
StaticTest staticTest2=new StaticTest();
StaticTest staticTest3=new StaticTest();
StaticTest staticTest4=new StaticTest();
}
}
-
静态变量除了被声明为常量外很少使用,静态变量是指声明为 public/private,final 和 static 类型的变量。静态变量初始化后不可改变。
-
静态变量储存在静态存储区。经常被声明为常量,很少单独使用 static 声明变量。
在JMM中,内存总体来说被分为四个区域(涉及到线程并发常化简堆区域 和栈区域)stack区、heap区、code区、data区。static存储于data区域,此时可以知道在heap区新建的对象,对static的数是能起到加的作用,而对于自身非static变量,则是新建。
public class TreadTime {
static int total=0;
static void P0()
{
int i=1;
for(i=1;i<=10;i++) {
total = total + 1;
}
System.out.println(total);
}
static void P1()
{
int i;
for(i=1;i<=10;i++) {
total = total + 1;
}
System.out.println(total);
}
public static void main(String[] args) {
P1();
P0();
}
}
-
静态变量在第一次被访问时创建,在程序结束时销毁。
-
与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为 public 类型。
-
默认值和实例变量相似。数值型变量默认值是 0,布尔型默认值是 false,引用类型默认值是 null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化。
-
静态变量可以通过:ClassName.VariableName的方式访问。
-
类变量被声明为 public static final 类型时,类变量名称一般建议使用大写字母。如果静态变量不是 public 和 final 类型,其命名方式与实例变量以及局部变量的命名方式一致。
Static{}----静态初始化块
1、与对象无关,满足static的特征,一个类只执行一次;
2、执行的时机是加载的时候