| 文檔版本 |
開發工具 |
測試平台 |
工程名字 |
日期 |
作者 |
備忘 |
| V1.0 |
|
|
|
2016.02.26 |
lutianfei |
none |
成員變數與局部變數 成員變數與局部變數區別:
A:在類中的位置不同
成員變數:在類中,
方法外 局部變數:在
方法定義中或者
方法聲明上。 B:在記憶體中的位置不同:
成員變數:在
堆記憶體 局部變數:在
棧記憶體 C:生命週期不同
成員變數:隨著
對象的建立而存在,隨著對象的消失而消失 局部變數:隨著
方法的調用而存在,隨著方法的調用完畢而存在 D:初始化值不同
成員變數:有
預設初始值 局部變數:
沒有預設初始值,必須定義,賦值,然後才能使用。 註:局部變數名稱可以和成員變數名稱一致,在方法中使用的時候,採用
就近原則。
類 類型的形式參數問題 一個方法的形式參數是一個類 類型(參考型別),這裡其實需要的是
該類的對象。
//形式參數是 基本類型class Demo { public int sum(int a,int b) { return a + b; }}//形式參數是 參考型別class Student { public void show() { System.out.println("我愛學習"); }}class StudentDemo { //如果你看到了一個方法的形式參數是一個類 類型(參考型別),這裡其實需要的是該類的對象。 public void method(Student s) { //調用的時候,把main方法中的s的地址傳遞到了這裡 Student s = new Student(); s.show(); }}class ArgsTest { public static void main(String[] args) { //形式參數是基本類型的調用 Demo d = new Demo(); int result = d.sum(10,20); System.out.println("result:"+result); System.out.println("--------------"); //形式參數是參考型別的調用 //需求:我要調用StudentDemo類中的method()方法 StudentDemo sd = new StudentDemo(); //建立學生對象 Student s = new Student(); sd.method(s); //把s的地址給到了這裡 }}
匿名對象 匿名對象:就是沒有名字的對象。是對象的一種簡化表示形式。 匿名對象的兩種使用方式
對象調用方法僅僅一次的時候 作為實際參數傳遞 匿名調用好處
匿名對象調用完畢就是垃圾。可以被記憶體回收行程回收。
class Student { public void show() { System.out.println("我愛學習"); }}class StudentDemo { public void method(Student s) { s.show(); }}class NoNameDemo { public static void main(String[] args) { //帶名字的調用 Student s = new Student(); s.show(); s.show(); System.out.println("--------------"); //匿名對象 //new Student(); //匿名對象調用方法 new Student().show(); new Student().show(); //這裡其實是重新建立了一個新的對象 System.out.println("--------------"); //匿名對象作為實際參數傳遞 StudentDemo sd = new StudentDemo(); //匿名對象 sd.method(new Student()); //再來一個 new StudentDemo().method(new Student()); }}
封裝
封裝概述: 是指隱藏對象的屬性和實現細節,僅對外提供公用訪問方式。
好處: 隱藏實現細節,提供公用的訪問方式 提高了代碼的複用性 提高安全性
封裝原則: 將不需要對外提供的內容都隱藏起來。 把屬性隱藏,提供公用方法對其訪問。
註: 測試類別一般只建立對象,調用方法。 private關鍵字 是一個許可權修飾符,是封裝的一種體現。 可以修飾成員(成員變數和成員方法) 被private修飾的成員只在本類中才能訪問。 private最常見的應用 把成員變數用private修飾 提供對應的getXxx()/setXxx()方法 this關鍵字 this:代表所在類的對象引用 方法被哪個對象調用,this就代表那個對象
class Student { //姓名 private String name; //年齡 private int age; //姓名擷取值 public String getName() { return name; } //姓名設定值 public void setName(String name) { //name = "林青霞"; //Student.name = name; this.name = name; } //年齡擷取值 public int getAge() { return age; } //年齡賦值 public void setAge(int age) { this.age = age; }}//測試類別class StudentTest { public static void main(String[] args) { //建立學生對象 Student s = new Student(); //給成員變數賦值 s.setName("林青霞"); s.setAge(27); //擷取資料 System.out.println(s.getName()+"---"+s.getAge()); }}
構造方法
構造方法作用概述 給對象的資料進行初始化
構造方法格式 方法名與類名相同 沒有傳回值類型,連void都沒有 沒有具體的傳回值。(可以有return;這一語句,表示方法到這裡結束)
構造方法注意事項 如果你不提供構造方法,系統會給出預設無參構造方法 如果你提供了構造方法,系統將不再提供預設的無參構造方法。必須自己給出。(建議永遠自己給出無參構造方法。) 構造方法也是可以重載的
class Student { private String name; private int age; public Student() { System.out.println("這是無參構造方法"); } //構造方法的重載格式 public Student(String name) { System.out.println("這是帶一個String類型的構造方法"); this.name = name; } public Student(int age) { System.out.println("這是帶一個int類型的構造方法"); this.age = age; } public Student(String name,int age) { System.out.println("這是一個帶多個參數的構造方法"); this.name = name; this.age = age; } public void show() { System.out.println(name+"---"+age); }}class ConstructDemo2 { public static void main(String[] args) { //建立對象 Student s = new Student(); s.show(); System.out.println("-------------"); //建立對象2 Student s2 = new Student("林青霞"); s2.show(); System.out.println("-------------"); //建立對象3 Student s3 = new Student(27); s3.show(); System.out.println("-------------"); //建立對象4 Student s4 = new Student("林青霞",27); s4.show(); }}
一個基本類的標準代碼寫法 成員變數 構造方法
無參構造方法 帶參構造方法
成員方法 getXxx() setXxx()
給成員變數賦值的方式 無參構造方法+setXxx() 帶參構造方法
/* 一個標準代碼的最終版。 學生類: 成員變數: name,age 構造方法: 無參,帶兩個參 成員方法: getXxx()/setXxx() show():輸出該類的所有成員變數值 給成員變數賦值: A:setXxx()方法 B:構造方法 輸出成員變數值的方式: A:通過getXxx()分別擷取然後拼接 B:通過調用show()方法搞定*/class Student { //姓名 private String name; //年齡 private int age; //構造方法 public Student() { } public Student(String name,int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } //輸出所有的成員變數值 public void show() { System.out.println(name+"---"+age); }}//測試類別class StudentTest { public static void main(String[] args) { //方式1給成員變數賦值 //無參構造+setXxx() Student s1 = new Student(); s1.setName("林青霞"); s1.setAge(27); //輸出值 System.out.println(s1.getName()+"---"+s1.getAge()); s1.show(); System.out.println("----------------------------"); //方式2給成員變數賦值 Student s2 = new Student("劉意",30); System.out.println(s2.getName()+"---"+s2.getAge()); s2.show(); }}
Student s = new Student();在記憶體中做了哪些事情 載入Student.class檔案進記憶體 在棧記憶體為s開闢空間 在堆記憶體為學生對象開闢空間 對學生對象的成員變數進行預設初始化 對學生對象的成員變數進行顯示初始化 通過構造方法對學生對象的成員變數賦值 學生對象初始化完畢,把對象地址賦值給s變數
static關鍵字(重痛點)
可以修飾成員變數和成員方法
static關鍵字特點 隨著類的載入而載入 優先於對象存在 被類的所有對象共用
這也是我們判斷是否使用靜態關鍵字的條件 可以通過類名調用,也可以通過對象調用。
static關鍵字注意事項 在靜態方法中是沒有this關鍵字(無法從靜態上下文引用非靜態 變數 xxx)
因為靜態時隨著類的載入而載入,this是隨著對象的建立而存在。 靜態比對象先存在。 靜態方法只能訪問靜態成員變數和靜態成員方法,非靜態方法可以隨意訪問。
class Teacher { public int num = 10; public static int num2 = 20; public void show() { System.out.println(num); //隱含的告訴你訪問的是成員變數 System.out.println(this.num); //明確的告訴你訪問的是成員變數 System.out.println(num2); } public static void method() { //無法從靜態上下文中引用非靜態 變數 num //System.out.println(num); System.out.println(num2); //無法從靜態上下文中引用非靜態 方法 function() //function(); function2(); } public void function() { } public static void function2() { }}class TeacherDemo { public static void main(String[] args) { //建立對象 Teacher t = new Teacher(); t.show(); System.out.println("------------"); t.method(); }}
靜態變數和成員變數的區別 所屬不同
靜態變數屬於類,所以也稱為類變數 成員變數屬於對象,所以也稱為執行個體變數(物件變數) 記憶體中位置不同
靜態變數儲存於方法區的靜態區 成員變數儲存於堆記憶體 記憶體出現時間不同
靜態變數隨著類的載入而載入,隨著類的消失而消失 成員變數隨著對象的建立而存在,隨著對象的消失而消失 調用不同
靜態變數可以通過類名調用,也可以通過對象調用 成員變數只能通過對象名調用 main方法是靜態 public static void main(String[] args) {}
public 公用的,存取權限最大,因為被jvm調用,需要存取權限足夠大。 static 靜態,不需要建立對象,被jvm調用,不用建立對象,直接類名訪問 void被jvm調用,不需要給jvm傳回值 main 一個通用的名稱,雖然不是關鍵字,但是被jvm識別 String[] args 以前用於接收鍵盤錄入的
eg:java MainDemo hello world java