一、静态变量
在java中,静态变量指的是被static修饰的类的变量;静态变量被所有类实例对象所共享,在内存中只有一个副本,当且仅当在类初次加载时会被初始化。
未被static修饰的成员变量和方法分别被称为实例变量和实例方法。
访问方式
静态变量(方法)的访问方式:类名.变量名(方法名)
实例变量(方法)需要先将类实例化后才可访问:对象名.变量名(方法名)
静态变量和成员变量的区别
静态变量存在于方法区中,成员变量存在于堆内存中。
成员变量随着对象创建而存在,随着对象被回收而消失;静态变量随着类的加载而存在。
注意
静态方法中不需要它所属类的任何实例就可以访问,所以在静态方法中不可以使用this关键字。
静态方法中不可直接访问所属类的实例变量和实例方法,但可以直接访问所属类的静态变量和静态方法。
public class staticclass {
public static int count = 0; //静态变量
public int num =0; //非静态变量
public static void method1(){ //静态方法
System.out.println("正在访问静态方法(count++)....");
System.out.println("\tpre-count = "+count);
count++;
//num++; //静态方法中不可以访问实例变量
//method2(); //静态方法中不可以访问实例方法
//System.out.println(this.num); //静态方法中不可以使用this关键字
System.out.println("\tpst-count = "+count);
}
public void method2() //实例方法
{
System.out.println("正在访问实例方法(count+2,num+3)....");
System.out.println("\tpre-count = "+count);
System.out.println("\tpre-num = "+num);
count+=2;
num+=3;
System.out.println("\tpst-count = "+count);
System.out.println("\tpst-num = "+num);
}
public static void main(String[] args) {
System.out.println("初始时,count = "+staticclass.count); //访问静态变量:类名+变量名
staticclass.method1();//访问静态方法:类名+变量名
staticclass a = new staticclass();
System.out.println("\na未操作前,count = "+staticclass.count);
System.out.println(" num = "+a.num);
a.method2();
staticclass b = new staticclass();
System.out.println("\nb未操作前,count = "+staticclass.count);
System.out.println(" num = "+b.num);
b.method2();
}
}
运行结果:
初始时,count = 0
正在访问静态方法(count++)....
pre-count = 0
pst-count = 1
a未操作前,count = 1
num = 0
正在访问实例方法(count+2,num+3)....
pre-count = 1
pre-num = 0
pst-count = 3
pst-num = 3
b未操作前,count = 3
num = 0
正在访问实例方法(count+2,num+3)....
pre-count = 3
pre-num = 0
pst-count = 5
pst-num = 3
可以看出:
静态变量count是多个对象实例共享的。
实例对象num是多个对象实例私有的。
二、成员变量、局部变量
在java中,成员变量是指在类内方法外定义的变量;
而局部变量是指在方法中定义的变量,作用范围是其所在的方法。
public class Student {//这是一个类
//name和age是成员变量,作用范围是整个类
private String name;
private int age;
public void do(int age) {//这个age是方法的形式参数,是局部变量
//task是定义在方法do内部的变量,作用范围是do方法内,所以是局部变量
String task;
}
}
不同
1、在类中位置不同:局部变量在方法中,成员变量在方法外。
2、在内存中位置不同:局部变量在栈内存中,成员变量在堆内存中。
3、生命周期不同:
局部变量随方法的调用而存在,当方法被执行时局部变量被创建,当方法执行完毕出栈,局部变量跟随方法消失。
成员变量随对象的存在而存在,当对象被创建之后,成员变量作为对象的属性,会与对象一同被存储在堆内存中,一直到对象消失才跟着消失。
4、初始化值不同:
局部变量定义之后,必须主动赋值初始化才能被使用。
成员变量作为对象的一部分,当对象被创建后,成员变量会被自动赋默认值(一般基本数据类型赋0,引用数据类型赋null)。
5、作用范围不同:局部变量只在其所在的方法内部生效,成员变量在其所在的整个类中生效。