1.从语法区别上说:变量声明时前面加了static关键字的变量为静态变量又称为类变量,反之变量声明时没加static修饰的变量为实例变量。
2.变量的隶属:静态变量是该类的所有对象所共享的,即该变量属于该类,而不属于某个对象,而实例变量则是属于特定的对象的。
3.变量何时存在:静态成员在类的对象初始化前可以通过类名访问,即静态变量在new对象之前就已经存在内存中,类的静态成员在类加载(即第一次创建一个类)的时候分配空间,静态成员贯穿整个生命周期==》如:main方法为static的。 而实例变量要在创建对象时才分配内存。
4.静态方法:
1)静态方法中只能访问静态成员(原因:若要被访问,首先得在内存中已分配空间)
2)非静态方法中可以访问类的静态成员
3)静态方法中没有this引用
5.静态块
static{}主要是用于给类的静态化成员赋值的
{ }代码块在每次实例化对象前执行,在调用构造方法前执行
6.执行顺序:
1)先执行代码块再执行构造方法
2)先自动执行静态块,再执行静态方法(需要手动调用)
7.静态变量和实例变量,实例:
public class TestIns{
public static void main(String[] args) {
for(int i = 0;i<10;i++){
new Son();
}
}
}
class Son{
int var=0;
static int staticVar =0;
Son(){
var++;
staticVar++;
System.out.println(var+"=============="+staticVar);
}
}
结果:
1==============1
1==============2
1==============3
1==============4
1==============5
1==============6
1==============7
1==============8
1==============9
1==============10
8.静态块代码块的执行
public class TestIns{
public static void main(String[] args) {
new Son();
Son.test();
}
}
class Son{
int var=0;
static int staticVar ;
static{
staticVar=3;
System.out.println("我是静态块,给静态变量赋值了");
}
Son(){
System.out.println("我是 构造方法 被执行了");
}
{
System.out.println("我是 代码块 被执行了");
}
static void test(){
System.out.println("我是 静态方法");
}
}
结果:
我是静态块,给静态变量赋值了
我是 代码块 被执行了
我是 构造方法 被执行了
我是 静态方法
===========================================================================
类变量可以通过类名直接调用,类名.静态变量名
实例变量要通过,对象.变量名