1. 程式人生 > >java類基礎1-成員變數和區域性變數

java類基礎1-成員變數和區域性變數

成員變數:寫在類體的裡面,方法體的外面,宣告時可以不進行初始化值,可以被本類或其他類的方法進行呼叫。
區域性變數:寫在方法體的裡面,宣告時必須進行初始化,只能在宣告區域性變數的方法內進行呼叫。

public class Student {
	String name;
	int age=20;
	boolean sex;
	int id; //成員變數
	public void doExercise(String sport) {
		int i=4;//區域性變數
		System.out.println(i);
		System.out.println(name+"doing"+sport);
	}
	public void talk(String language) {
		int i=6;//local veriable
		System.out.println(i);
		System.out.println("speak in "+language);
		System.out.println(age);
	}
}

物件在記憶體中呼叫過程圖解:

在JVM記憶體裡面主要分佈有以下三個區域:

  • 棧:存放基礎資料和自定義物件的引用
  • 堆:主要儲存建立的物件,即new出來的物件。
  • 方法區:載入存放class檔案(位元組碼檔案)
//學生類
public class Student {
	String name;
	int age=20;
	String sex;
	int id;
	public void doExercise(String sport) {
		System.out.println(name+"doing"+sport);
	}
	public void talk(String language) {
		System.out.println("speak in "+language);
	}
}
//學生測試類
public class StudentTest {
	public static void main(String[] args) {
		Student s1=new Student();
		s1.id=1001;
		s1.name="XiaoLi";
		s1.age=18;
		s1.sex="男";
		s1.doExercise("basketball");
		s1.talk("Chinese");
		System.out.println(s1.age);
		System.out.println(s1.name);
		System.out.println(s1.id);
		System.out.println(s1.sex);
		
	}
}

                                             

通過上圖來看,程式是這樣執行的:

  1. 將StudentTest01.class檔案載入到方法區
  2. 將Student.class檔案載入到方法區
  3. main方法壓棧
  4. 在堆裡面建立一個Student的物件
  5. 棧裡面的s指向堆裡面Student物件的記憶體地址0x0101
  6. 給物件的成員變數進行賦值
  7. 方法彈棧
  8. 程式執行結束

 這裡面主要說明的一點就是圖中的實線,這個實線表示的是s指向Student物件堆記憶體的地址,s本身並不是物件,而是一個指向。比如酒店裡面的房間號1024,1024本身不是房間,只是指向了這個房間的號碼,方便住宿人員快速找到該房間。

兩個物件的圖解:

public class  studentTest{

    public static void main(String[] args){

    Student s = new Student();
    s.name = "張三";
    s.age = 20;
    s.sex = true;
    s.id = 1001;

    Student s1 = new Student();
    s1.id=1002;
    s1.name="李四";
    s1.age=21;
    s1.sex=false;
    }
}

三個指向兩個物件的圖解:

public class StudentTest01{
    public static void main(String[] args){
    Student s = new Student();
    s.name = "張三";
    s.age = 20;
    s.sex = true;
    s.id = 1001;

    Student s1 = new Student();
    s1.id=1002;
    s1.name="李四";
    s1.age=21;
    s1.sex=false;

    Student s2 = s1;
    }
}

上面程式碼將s1指向的物件賦給s2,相當於s1和s2指向同一個物件

取消指向,呼叫這個沒有指向的引用會報錯,空指標異常

public class studentTest{

    public static void main(String[] args){

    Student s = new Student();
    s.name = "張三";
    s.age = 20;
    s.sex = true;
    s.id = 1001;

    s = null;//將s設定為null
    //s.study();報出NullPointerException(空指標異常)


    }
}

 

如果堆裡面的物件沒有被指向,Java裡面有個垃圾回收器會將物件進行回收。開發時不需要手動設定為null,垃圾回收器會自動回收。

原文:http://www.monkey1024.com/javase/257