1、Static静态变量
Static是静态修饰符。
在程序中任何变量或者代码都是在编译时,由系统自动分配内存来存储的,而所谓静态就是指在编译后分配的内存会一直存在,直到程序推出时才会释放内存空间。
在java程序里,所有东西都是对象,而对象的抽象就是类,对于一个类而言,如果要使用他的成员(成员指类中的函数、变量)
普通情况:必须先实例化对象后才能通过对象的引用才能访问这些成员
例外:该成员是用Static声明的 (这里所讲排除了类的访问控制)
//未声明static
class ClassA{
int b;
public void ex1(){
}
}
class ClassB{
void ex2{
int i;
ClassA a = new ClassA();
i = a.b; //这里通过 对象引用 访问成员变量b
a.ex1; //这里通过 对象引用 访问成员函数b
}
}
//声明为static
class ClassA{
static int b; //静态变量
static void ex1(){
}
}
class ClassB{
void ex2{
int i;
ClassA a = new ClassA();
i = ClassA.b; //这里通过 类 访问成员变量b
ClassA.ex1; //这里通过 类 引用访问成员函数b
}
}
通过以上两种比较,就可以知道static用来修饰类成员的主要作用,在java类库当中有很多类成员都声明为static,可以让用户不需要实例化对象就可以引用成员,最基本的有Integer.praseInt(),Float.ParseFloat()等等用来把对象的类型转化为所需要的基本数据类型。
这样的变量和方法 又叫 类变量 和 类方法。
static修饰后的变量的值。被static修饰后的成员,在编译时由系统分配一块内存空间,直到程序停止运行才会释放。那么就是说该类的所有对象都会共享这块内存空间。
class TStatic{
static int i;
public TStatic(){
i = 4;
}
public TStatic(int j){
i = j;
}
public static void main(String args[]){
TStatic t = new TStatic(5); //声明对象引用,并实例化
TStatic tt = new TStatic(); //同上
System.out.println(t.i); // 4
System.out.println(tt.i); // 4
System.out.println(t.i); // 4
}
}
在这段代码里面 TStatic 类 有一个 static 的 int 变量 i,
有两个构造函数(与类名同名的、且不带返回值的函数叫做构造函数),第一个初始化i 为4,第二个用于初始化 i 为传进函数函数的值,在mian函数中所传的值是5,
在程序中首先声明对象t,然后调用带参数的构造函数实例化对象,此时对象t的成员变量i的值是5,
接着声明对象tt,调用无参数的构造函数,那么就把对象tt的成员变量i的初始化为4了,
在这里i是Static, 该类的所有的对象都共享该内存。
也就是说:实例化对象tt的时候改变了i的值,实际上对象t的i值也改变了,因为实际上他们引用的是同一个成员变量。
最后打印结果是三个4。
2、实例变量
又叫 成员变量、对象变量。
实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。