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、实例变量

又叫 成员变量、对象变量。

实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。