1. 程式人生 > >Java_51_組合_內部類詳解_字串(String類)_equals和==的區別

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物件的內容。