物件導向:
1. 三大特性
封裝性 對外部不可見。可以保護程式中的某些程式
繼承性 擴充功能
多態性 方法的重載 對象是多態性
2.對象是儲存在棧記憶體之中的,屬性儲存在堆記憶體中的。
在程式中的所有的方法是儲存在全域代碼區中的,此區中的內容是所有的對象共用的。
在使用對象的時候,對象必須被執行個體化之後對能被使用。(執行個體化對象並不是單單指的
是通過new關鍵字實現的,只要其有堆記憶體的空間指向,則就表示執行個體化成功。)
在引用操作中,如果一個對象沒有堆記憶體的引用,而調用了類中的屬性或方法,就會出現
錯誤。java.lang.NullPointerException.
3 .所謂引用資料類型,實際上傳送的就是堆記憶體的使用權,可以同時為一個堆記憶體空間定義多個棧記憶體的引用操作。
4 聲明對象時是不去調用構造方法的。執行個體化對象時才去調用構造方法。
5 所謂的匿名對象就是比之前的對象少了一個棧記憶體的參考關聯性、
6 String 的比較
public static void main(String[[ args){String str1 = "hello";String str2 = new String("hello");String str3 = str2;System.out.println("str1 == str2 ---->" + (str1 == str2)); //falseSystem.out.println("str1 == str3 ---->" + (str1 == str3)); //falseSystem.out.println("str2 == str3 ---->" + (str2 == str3)); //trues}
現在在=== 的判斷的是地址空間是否相等。判斷的是地址。
7.String 的兩種執行個體化方式
String name = "hello"; String name = new String("hellow");
字串其實就是String類的匿名對象。
public static void main(String[] args){System.out.println("hello".equals("hello"));}
其實 String name = "hello";
就是表示在一個常量池中初始化一個字串對象的指向給了棧記憶體空間。
只有掌握了這一點之後才可以分析出使用那種執行個體化方式更合適。看舉例:
public static void main(String[[ args){String str1 = "hello"; //直接賦值String str2 = "hello"; //直接賦值String str3 = "hello"; //直接賦值System.out.println("str1 == str2 ---->" + (str1 == str2)); //trueSystem.out.println("str1 == str3 ---->" + (str1 == str3)); //trueSystem.out.println("str2 == str3 ---->" + (str2 == str3)); //true}
以上三個對象的記憶體位址都一樣的。
原因:使用直接賦值的方式。在賦值之前。程式會先在記憶體中常量池去尋找有沒有一個的字元。 如果有的話, 則是直接記憶體空間去賦值另外一個對象。
如果沒有,則是去開闢空間。所以使用用直接賦值的方式可以去節省記憶體。在使用new String() 則是每次都去開闢兩個記憶體空間,然後再去釋放第一個。
兩個記憶體空間是應為"abc"也是一個匿名對象,那麼就也會去在常量池中建立個對象。然後在去記憶體中賦值,完了在去給常量池中的去刪除。
如:
String str = new String("hello");
分析: 首先,字串"hello" 是String 的匿名對象。則會先在常量池中去開闢一個空間。然後,又用New 去開闢一個新的記憶體空間。那麼先前的匿名對象的記憶體空間,就會被記憶體回收機制去回收。 這就是為什麼說的用new String會去要開闢兩個空間。使用直接賦值的方式只需要一個執行個體化對象即可。而使用New String() 的方式則是意味著要去開闢兩個記憶體空間。開發中最好去使用直接賦值的方式去開發。
8 .字串的內容一量聲明則不可改變。
public static void main(String[] args){String str = "hello "; // 開闢空間str = str + "world" ; // “world” 匿名對象開闢空間System.out.println("str = " + str); // "hello world" 再去開闢新的空間 .斷掉str 到hello的指向,// 然後將str指向hello world. }// 最後去回收了 hello 和 world 的空間。public static void main(String[] args){String str1 = "LiXinghua";for(int i = 0 ; i < 100 ; i ++){str1 + = i;}System.out.println(str1);}
這樣的操作要str1 斷開-連結 引用100次才能去實現。效能很低。
如果一定要去使用的話。應該去使用StringBuffer類。專門去完成這樣的功能。
9 .this 關鍵字
1) 表示類中的屬性
public Person(String name,int age){ // 通過構造方法賦值this.name = name ; // 為類中的name屬性賦值this.age = age ;// 為類中的age屬性賦值}
2 )使用this調用構造方法:如果在一個類中有多個構造方法,可以用this互相調用。
private String name ; // 姓名private int age ; // 年齡public Person(){ // 無參構造System.out.println("新對象執行個體化") ;}public Person(String name){this.name = name ;this() ;// 調用本類中的無參構造方法}public Person(String name,int age){ // 通過構造方法賦值this(name) ;// 調用有一個參數的構造方法this.age = age ;// 為類中的age屬性賦值}public String getInfo(){ // 取得資訊的方法\this() ;// 調用本類中的無參構造方法return "姓名:" + name + ",年齡:" + age ;}
注意點
1) this()調用構造方法的語句只能出現在構造方法的首行。
2)在使用this 調用本類中的其它構造方法的時候。至少有一個構造方法是不用this調用的。
3)使用this表示當前的對象。
當前對象:當前正在調用方法的對象。
class Person{ // 定義Person類public String getInfo(){ // 取得資訊的方法System.out.println("Person類 --> " + this) ; // 直接列印thisreturn null ; // 為了保證文法正確,返回null}};public class ThisDemo06{public static void main(String args[]){Person per1 = new Person() ; // 調用構造執行個體化對象Person per2 = new Person() ; // 調用構造執行個體化對象System.out.println("MAIN方法 --> " + per1) ; // 直接列印對象per1.getInfo() ; // 當前調用getInfo()方法的對象是per1System.out.println("MAIN方法 --> " + per2) ; // 直接列印對象per2.getInfo() ; // 當前調用getInfo()方法的對象是per2}};
4 Static 關鍵字:如果現在希望一個屬性被所有的對象所共同擁有,則可將其聲明為static類型。
聲明為 static 類型的屬性或方法之後稱為類屬性或類方法。可由類名直接調用。
1 )使用static 聲明屬性
每個對象擁有各自的堆棧空間。堆記憶體中儲存每個對象的各自的屬性。但是static
屬性儲存在了全域資料區中。所有的對象指向全域資料區中的一個內容。所以當一
個對象修改之後,所有對象的內容將全部變化。
java中的記憶體地區
1)) 棧記憶體:可以儲存對象的名稱(儲存訪問的堆記憶體的地址)
2))堆記憶體:儲存每個對象的具體屬性。
3))全域代碼區: 儲存static類型的屬性
4))全域代碼區: 儲存所有方法的定義:
一般的調用 static 屬性的時候最好是使用類名稱直接去調用。採用“類名。屬性”的形式:
2 )使用static 聲明方法
一個方法使用了static 去聲明 ,則此方法可以直接去用類名去調用。
注意點: 使用static 方法,不能調用非static的屬性或方法。
5 .對象數組
對象數組的每個元素都需要單去執行個體化。
Stuend[] stu = new Student[100];for(int i = 0 ; i < stu.length ; i ++){stt[i] = new Student();}
6 .內部類
1) 在一個類的內部還存在一個類為同內部類。
2 )在外部去訪問內部類。舉例:
第一種方法:
class Outer{ // 定義外部類private String info = "hello world" ; // 定義外部類的私人屬性class Inner{ // 定義內部類public void print(){ // 定義內部類的方法System.out.println(info) ; // 直接存取外部類的私人屬性}};public void fun(){ // 定義外部類的方法new Inner().print() ; // 通過內部類的執行個體化對象調用方法}};public class InnerClassDemo04{public static void main(String args[]){Outer out = new Outer() ; // 外部類執行個體化對象Outer.Inner in = out.new Inner() ; // 執行個體化內部類對象in.print() ; // 調用內部類的方法}};
第二種方法: 將內部類聲明為靜態類
class Outer{ // 定義外部類private static String info = "hello world" ; // 定義外部類的私人屬性static class Inner{ // 使用static定義內部類為外部類public void print(){ // 定義內部類的方法System.out.println(info) ; // 直接存取外部類的私人屬性}};public void fun(){ // 定義外部類的方法new Inner().print() ; // 通過內部類的執行個體化對象調用方法}};public class InnerClassDemo03{public static void main(String args[]){new Outer.Inner().print() ; // 調用外部類的fun()方法}};
使用static 的內部類將是外部類。
3。 在方法中去定義內部類:
一個內部類可以在任何的位置去定義.