1.對象的比較
- “==”操作符用於比較兩個對象的記憶體位址值是否相等
- equals() 方法用於比較兩個對象的內容是否一致
如下列:
1 public class text3 { 2 3 public static void main(String[] args) { 4 String str1 = new String("java"); 5 String str2 = new String("java"); 6 String str3 = str2; 7 8 if(str1 == str2) 9 {10 System.out.println("str1 == str2");11 }12 else13 {14 System.out.println("str1 != str2");15 }16 if(str2 == str3)17 {18 System.out.println("str2 == str3");19 }20 else21 {22 System.out.println("str2 != str3");23 } 24 25 }26 27 }
運行結果為:
str1 != str2str2 == str3
str1與str2的內容完全一樣,為什麼會不等於呢? 這兩個對象指向不同的記憶體空間,所以它們的記憶體位址是不一樣的。用“==”比較的是記憶體位址值。
如要比較內容,可用“equals”。
1 public class text3 { 2 3 public static void main(String[] args) { 4 String str1 = new String("java"); 5 String str2 = new String("java"); 6 String str3 = str2; 7 8 if(str1.equals(str2)) 9 {10 System.out.println("str1 == str2");11 }12 else13 {14 System.out.println("str1 != str2");15 }16 if(str2.equals(str3))17 {18 System.out.println("str2 == str3");19 }20 else21 {22 System.out.println("str2 != str3");23 } 24 25 }26 27 }
運行結果為:
str1 == str2str2 == str3
2.兩種String對象的聲明方式到底有什麼不同?
String str1 = new String("java");
String str2 = "java";
如下例:
1 public class text3 { 2 3 public static void main(String[] args) { 4 String str1 = "java"; 5 String str2 = new String("java"); 6 String str3 = "java"; 7 8 System.out.println("str1 == str2 ? -->"+(str1 == str2)); 9 System.out.println("str1 == str3 ? -->"+(str1 == str3));10 System.out.println("str3 == str2 ? -->"+(str3 == str2));11 12 }13 }
運行結果:
str1 == str2 ? -->falsestr1 == str3 ? -->truestr3 == str2 ? -->false
str1與str3相等,則證明str1與str3是指向同一個記憶體空間的。
String對象的內容一旦聲明則不能輕易改變。
如果想改變一個String對象的值,則第一步要做的是先將原有的String引用斷開,之後再開闢新的記憶體空間。
用new關鍵字開闢String對象的記憶體空間的話,則實際上就開闢了兩個記憶體空間。
3.類對象的產生
格式:
類名 對象名 = new 類名();
建立屬於某類的對象,需要通過如下兩個步驟來實現:
- 聲明指向“由類所建立的對象”的變數
- 利用new建立新的對象,並指派給先前所建立的變數
舉例:建立Person類的對象
Person p; //先聲明一個Person類的對象pp = new Person(); //用new關鍵字執行個體化Person的對象p
當然也可以用如下方式來聲明變數:
Person p = new Person() ; // 聲明Person對象p並直接執行個體化此對象
對象只有在執行個體化之後才能被使用,而執行個體化對象的關鍵字就是new。
4.訪問對象中某個變數或方法
訪問屬性: 對象名稱。屬性名稱存取方法: 對象名稱。方法名()
如:想訪問Person類中的name和age屬性
p.name; //訪問Person類中的name屬性p.age; //訪問Person類中的age屬性
5.類的屬性封裝(private)
要設定或取得屬性值,則只能用setXxx()、getXxx()方法,這是一個明確且標準的規定。
封裝類中的屬性或方法:
封裝屬性: private 屬性類型 屬性名稱封裝方法: private 方法傳回型別 方法名稱(參數)
加入一些setXxx()、getXxx()方法,主要用來設定和取得類中的私人屬性,解決封裝問題,如下列:
1 class Person 2 { 3 private String name; 4 private int age; 5 void talk() 6 { 7 System.out.println("wo shi: "+name+", jinnian: "+age+"sui"); 8 } 9 10 public void setName(String str)11 {12 name = str;13 }14 15 public void setAge(int a)16 {17 if(a > 0)18 age = a;19 }20 21 public String getName()22 {23 return name;24 }25 26 public int getAge()27 {28 return age;29 }30 }31 32 public class text17 {33 34 public static void main(String[] args) {35 36 Person p = new Person();37 p.setName("zhang san");38 p.setAge(-25);39 p.talk();40 41 }42 43 }
運行結果:
wo shi: zhang san, jinnian: 0sui
6.內部類
定義內部類的格式:
標示符 class 外部類的名稱{ //外部類的成員 標示符 class 內部類的名稱 { //內部類的成員 } }
外部類是無法找到內部類中所聲明的屬性,而內部類則可以訪問外部類的屬性。
用static聲明的內部類則變成外部類,但是用static聲明的內部類不能訪問非static的外部類屬性。(《Java基礎教程》P193)
7.類的繼承
類的繼承格式:
class 父類 //定義父類{}class 子類 extends 父類 // 用extends關鍵字實作類別的繼承{}
在java中只允許單繼承,不允許多重繼承,也就是說一個子類只能有一個父類,但java中卻允許多層繼承。
多層繼承如:
class A{}class B extends A{}class C extends B{}
子類對象在執行個體化時會預設先去調用父類中的無參構造方法,之後再調用本類中的相應構造方法。
super 主要的功能是完成子類調用父類中的內容,也就是調用父類中的屬性或方法。
用super調用父類中的構造方法,只能放在程式的第一行。
super調用屬性或方法:
super.父類中的屬性;super.父類中的方法();
8.this與super的比較
this:
- 1.表示當前對象
- 2.調用本類中的方法或屬性
- 3.調用本類中的構造方法時,放在程式首行
super:
- 1.子類調用父類的方法或屬性
- 2.調用父類中的構造方法時,放在程式首行
從上表中發現,用super或this調用構造方法時都需要放在首行。所以,super與this調用構造方法的操作時不能同時出現的。
9.抽象類別定義規則
- 抽象類別和抽象方法都必須用abstract關鍵字來修飾
- 抽象類別不能被執行個體化,也就是不能用new關鍵字去產生對象
- 抽象方法只需聲明,而不需實現
- 含有抽象方法的類必須被聲明為抽象類別,抽象類別的子類必須複寫所有的抽象方法後才能被執行個體化,否則這個子類還是個抽象類別
10.final關鍵字
在Java中聲明類、屬性和方法時,可使用關鍵字final來修飾。
- final標記的類不能被繼承。
- final標記的方法不能被子類複寫。
- final標記的變數(成員變數或局部變數)即為常量,只能賦值一次。