一、成员变量
- 实例变量:
- 属于对象的,存在堆中
- 有几个对象就有几份实例变量
- 必须通过对象名. 来访问
- 静态变量(由static修饰):
- 属于类的,存在方法区中
- 只有一份
- 常常通过类名.来访问
- 何时用?—若所有对象的数据都一样时使用,只有一份(比如一个班的所有学生的班级号都是一样的,这时班号可以设置为static静态变量 或者卡号,密码,余额,利率中 利率就可以设置为静态变量)
二、静态方法
- 由static修饰的
- 属于类的,存在方法区中,只有一份
- 常常通过类名.来访问的
- 没有隐式的this传递,静态方法中不能直接访问实例成员–没有this就意味着没有对象,而实例变量必须通过对象点来访问,所以静态方法中不能直接访问实例成员
- 何时用?–方法的操作仅与参数相关而与对象无关时使用实例变量和实例方法比静态变量和静态方法用的更多
三、静态块
- 由static修饰
- 属于类的,类被加载期间自动执行。类只被加载一次,所以静态块也只执行一次
- 何时用:常常用于加载/初始化静态资源(图片、音频、视频···)
public class StaticDemo {
public static void main(String[] args) {
Loo o1=new Loo();
o1.show();//1 1 a,b都初始化为0,通过自增,都为1
Loo o2=new Loo();
o2.show();//1 2 a是实例变量,存于堆中,第二次new的话,在堆中会开辟一个新的区域初始化是0,所以自增为1
//b是静态变量,存于方法区中,只有一份,初始化时候是0,所第一次加1为1,第二次加1为2
System.out.println(Loo.b);//静态变量常常通过类名.来访问---建议
System.out.println(o1.b);//静态变量也可以通过类名.来访问---不建议
Moo.test();//静态方法通过类名.来访问
Noo o3=new Noo();
Noo o4=new Noo();//静态块 构造方法 构造方法
Noo o5=new Noo();//静态块 构造方法 构造方法 构造方法
}
}
class Noo{
static{
System.out.println("静态块");
}
Noo(){
System.out.println("构造方法");
}
}
class Moo{//演示静态方法
int a;
static int b;
void show(){
a=1;
b=2;
}
static void test(){//静态方法,没有隐式的this
//a=1;//编译错误--此方法没有this,意味着没有对象,但a只能通过对象.来访问,所以错误
b=2;
}
}
class Loo{
int a;//实例变量
static int b;//静态变量
Loo(){
a++;
b++;
}
void show(){
System.out.println("a="+a);
System.out.println("b="+b);
}
}