Java_51_組合_內部類詳解_字串(String類)_equals和==的區別
組合
使用組合,可以獲得更多的靈活性,你甚至可以在執行的時候才決定哪幾個類組合在一起。
使用繼承,他是一種高度耦合,派生類和基類被緊緊的綁在一起,靈活性大大降低,而且,濫用繼承,也會使繼承樹變得又大又複雜,很難理解和維護。
如果是is-a關係,用繼承。【是一個[物件]】
如果是has-a關係,用組合。【擁有一個[成員變數]】
可以這麼理解:假設a,b都是一種型別,a is-a b,說明a類物件是b類物件,只不過是特殊的一種。比如說”飛機“是一種“交通工具”。對應到c++中就是繼承關係。
a has-a b,說明a類物件具有若干b類物件作為其成員。比如“飛機”有”翅膀“。
私有繼承實現has-a關係,一是從物件關係上來說是不合理的,寫程式的人知道,但是看程式的人就會誤會了。二是,用私有繼承,比如a中私有繼承了b,那麼b的所有成員和函式在a中都是private,不能直接訪問的了,會對後面的使用造成不方便。[摘自百度知道]
內部類的作用:
1.內部類提供了更好的封裝。只能讓外部類直接訪問,不允許同一個包中的其他類直接訪問。
2.內部類可以直接訪問外部類的私有屬性,內部類被當成其外部類的成員。但外部類不能訪問內部類的內部屬性。
內部類的使用場合:
由於內部類提供了更好的封裝特性,並且可以很方便的訪問外部類的屬性。所以,通常內部類在只為所在外部類提供服務的情況下優先使用。
內部類的分類:
1.成員內部類(可以使用private、proteted、public任意進行修飾。類檔案:外部類$內部類.class)
2.非靜態內部類(外部類裡使用非靜態內部類和平時使用其他類沒什麼不同)
3.非靜態內部類必須寄存在一個外部類物件裡。因此,如果有一個非靜態內部類物件那麼一定存在對應的外部類物件。非靜態內部類物件單獨屬於外部類的某個物件。
4.非靜態內部類可以使用外部類的成員,但是外部類不能直接訪問非靜態內部類成員。
5.非靜態內部類不能有靜態方法、靜態屬性、靜態初始化塊。
6.靜態成員不能訪問非靜態成員:外部類的靜態方法、靜態程式碼塊不能訪問非靜態內部類,包括不能使用非靜態內部類定義變數、建立例項。
7.成員變數訪問要點:
7.1 內部類裡方法的區域性變數:變數名 //varName(變數名或方法名)
7.2 內部類屬性:this.變數名 //this.varName(內部類方法或屬性)
7.3 外部類屬性:外部類名.this.變數名 //className.this.varName(方法或屬性)
8.內部類的訪問:
8.1 外部類中定義內部類:new lnnerClass()
8.2 外部類以外的地方使用非靜態內部類:Outer,inner varname = OuterObject.new lnner()
Face.Nose nose=new Face().new Nose();//(宣告方法一)普通內部類
Face f2=new Face();//(宣告方法二)普通內部類
Face.Nose nose2=f2.new Nose();//(宣告方法二)普通內部類
9.靜態內部類
9.1 定義方式:static class className{//類體}
9.2 使用要點:
9.2.1 當一個靜態內部類物件存在,並不一定存在對應的外部類物件。因此,靜態內部類的例項方法不能直接訪問外部類的例項方法。
9.2.2 靜態內部類看作外部類的一個靜態成員。因此,外部類的方法中可以通過:靜態內部類.名字 訪問靜態內部類的靜態成員。通過new靜態內部類()訪問靜態內部類的例項。
9.2.3 在外部類的外面建立靜態內部類:
Face.TestStaticlnner alnner=new Face.TestStaticlnner();//靜態內部類
10.匿名內部類
適合那種只需要使用一次的類。比如:鍵盤監聽操作等等。語法:new 父類構造器(實參列表)實現介面(){ //匿名內部類類體 }
11.區域性內部類(方法內部類)
定義在方法內部。作用域只限於本方法。用的非常少。
字串(Java.lang.String類)的使用
Java字串就是Unicode字元序列,例如串“Java”就是4個Unicode字元J,a,v,a組成的。
Java沒有內建的字串型別,而是在標準Java類庫中提供了一個預定義的類String,每個用雙引號括起來的字串都是String類的一個例項。
String e="";
String greeting="Hello World";
Java允許使用符號“+”把兩個字串連線起來
String s1="Hello";
String s2="World!";
String s=s1+s2;//HelloWorld!
符號“+”把兩個字串按固定的順序連線在一起,並且是完全按照固定的形式。
當“+”運算子兩側的運算元中只要有一個是字串(String)型別,系統會自動將另一個運算元轉換為字串然後在進行連線。
int age=11;
String s="age is”+age;//s 賦值為age is 18
這種特性通常被用在輸出語句中:
System.out.println("age is”+age);
開始學習閱讀API文件:
字串類常用的方法:
char cahrAt(int index) 返回字串中第index個字元。
boolean equals(String other) 如果字串與other相等,返回true。
boolean equalslgnoreCase(String other) 如果字串與other相等(忽略大小寫)則返回true。
int indexOf(String str) lastIndexOf()
int indexOf(String str,int fromIndex)
返回與str匹配的第一個字串的開始位置,該位置從0或fromIndex開始計算,如果元氏串中不存在str,返回-1。
int length() 返回字串的長度。
String reqlace(char oldChar,char newChar) 返回一個新串,它是通過用newChar替換此字串中出現的所有oldChar而生成的。
boolean startsWith(String prefix) 如果字串以prefix開始,則返回true。
boolean endsWith(String prefix) 如果字串一prefix結尾,則返回true。
String substring(int beginIndex) 返回一個新字串,該串包含從原始字串beginIndex到串尾或endIndex-1的所有字元。
String toLowerCase() 返回一個新字串,該串將原始字串中的所有大寫字母改成小字母。
String toUpperCase() 返回一個新字串,該串將原始字串中的所有小字母改成大寫字母。
String trim() 返回一個新字串,該串刪除了原始字串頭部和尾部的空格。
equals 方法用來檢測兩個字串內容是否相等。如果字串s和t內容相等,則s.equals(t)返回true,否則返回false。s和t即可以是字串變數,也可以是字串常數,例如:“Hello”.equals(t);
"Hello".equalsIgnoreCase("hellO");//true
判斷字串是否相等不要使用“==”
equals和==的區別
1.“==”比較的是引用地址是否相等【基礎型別比較和引用型別比較】。
2.“equals”預設比較的是引用地址,如果equals實現後是比較的是內容是否相等(字串等等)。
3.如果是String類的物件,使用equals比較的話就是比較字元內容是否相等,因為String類原始碼已經實現了equals字元比較的方法。
equals原始碼:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
--------------------------------------------------------------
public class Test {
public static void main(String[] args) {
String a1="qwer";
String a2="qwer";
Test a3=new Test();
Test a4=new Test();
String a5=new String("qwer");
String a6=new String("qwer");
System.out.println("變數a1 equals 變數a2 ="+a1.equals(a2));
System.out.println("變數a1 == 變數a2 ="+(a1==a2));
System.out.println("Test物件a3 equals Test物件a4 ="+a3.equals(a4));
System.out.println("Test物件a3 == Test物件a4 ="+(a3==a4));
System.out.println("String物件a5 equals String物件a6 ="+a5.equals(a6));
System.out.println("String物件a5 == String物件a6 ="+(a5==a6));
}
}
ps:重點!重點!重點! Test例項物件equals實際使用的“==”,String例項物件因為equals已經實現了String 字串的對比方法,所以比較的是String物件的內容。