java類基礎1-成員變數和區域性變數
阿新 • • 發佈:2018-12-01
成員變數:寫在類體的裡面,方法體的外面,宣告時可以不進行初始化值,可以被本類或其他類的方法進行呼叫。
區域性變數:寫在方法體的裡面,宣告時必須進行初始化,只能在宣告區域性變數的方法內進行呼叫。
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); } }
通過上圖來看,程式是這樣執行的:
- 將StudentTest01.class檔案載入到方法區
- 將Student.class檔案載入到方法區
- main方法壓棧
- 在堆裡面建立一個Student的物件
- 棧裡面的s指向堆裡面Student物件的記憶體地址0x0101
- 給物件的成員變數進行賦值
- 方法彈棧
- 程式執行結束
這裡面主要說明的一點就是圖中的實線,這個實線表示的是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