Java總結第七章
本章內容:
1. Object類的toString()與equals(Object obj)方法
2. 面向物件的多型性
3. 抽象類與介面
重點:個人感覺本章都很重要一.Object類的toString()與equals(Object obj)
1.簡述Object類:
* Object類是所有Java類的根基類(“祖先類”)
* 如果在類的宣告中未使用extends關鍵字指明其基類,則預設基類為Object類
2.toString()方法(返回String)
* Object類中定義有public StringtoString()方法,其返回值是String型別,描述當前物件的有關資訊。
* 如果直接列印某物件的引用則打印出來的結果相當於呼叫了這個物件中的toString(),引用會顯示指向地址。
* 可以根據需要重寫toString()方法,若不重寫則呼叫的是父類。
例:package object;
public class ToStringDemo {
public static void main(String[] args) {
Student stu=new Student("張三",20,83.5);
System.out.println(stu);
}
}
結果截圖:
3.equals()方法
* Object類中定義有publicboolean equals(Objectobj)方法,提供定義物件是否“相等”的邏輯。
* Object的equals方法定義為:x.equals(y); //當x和y指向同一個地址時返回true,否則返回false。
* String類中已經重寫了equals(Object obj)方法,重寫後的方法比較的是兩個字串的”內容”是否一樣(注意:==比較物件的引用)。
字串.equals()已經被重寫。
如,“abc”.equals("abc"); //重寫後比較當前物件和傳入引數物件是否相等。相等為true,否則為false。
* 可以根據需要在使用者自定義型別中重寫equals方法。
例:package object;
public class EqualsDemo {
public static void main(String[] args) {
Student stu1=new Student("張三",20,83.5);
Student stu2=new Student("張三",20,83.5);
System.out.println("stu1與stu2相等嗎?"+stu1.equals(stu2));
}
}
執行截圖:二.多型性:一個行為的多種表現方式;
1.**從方法角度看:過載和重寫就用到了多型。
過載(overloading):根據傳入的引數不同,完成的功能也不同
重寫(override):子類根據需求重寫父類中的方法。**從物件的角度看:向上轉型,向下轉型(把右邊轉為左邊的)
向上轉型(將子類轉換為父類),可自動轉換。(為了確認關係)
*格式:
父類父類物件=子類例項
向上轉型後,因為操作的是父類物件,所以無法找到在子類中定義的新方法;但如果子類重寫了父類的某個方法,則呼叫的是重寫後的方法。
向下轉型(必須明確指出要轉型的子類的型別)前先要向上轉型,還可以在方法中傳參時向上轉型。
*格式:
子類 子類物件=(子類)父類例項2.instanceof關鍵字
使用這個關鍵字來判斷,如果一個物件屬於一個類的例項,則true,否則false。
*(一般判斷傳遞的引數是否屬於自己寫的那個類時可以用來將其他不符合的物件排除在外)
*格式:
物件 instanceof 類 ——> (返回boolean型別)3.final關鍵字
*表示最終的。
*** 若是final修飾的類即父類,別人不能繼承(String類即被final修飾,別人不能繼承他);
格式:
final class finalClassName{
…
}
*** 若修飾屬性,則成為常量,該屬性在宣告時就應該被初始化,且後面無法修改,屬於只讀;
格式:
final 型別 variableName;
*注意:(可以用來修飾區域性變數和成員變數) 修飾成員變數時,定義時同時給出初始值,而修飾區域性變數時不做要求。
*** 修飾方法則該方法子類無法重寫。
格式:
final 返回值型別 methodName(paramList)
{
…
}
三.抽象類與介面
1.抽象類
用abstract修飾的類一定是抽象類。
抽象類不能被例項化,必須被繼承,抽象方法必須被重寫,生成它的子類,他的子類可以被例項化。
如果一個子類沒有實現抽象父類中的所有抽象方法或者只實現了一部分,則子類也稱為一個抽象類,如父親欠債子還,若兒子只還了一部分後也欠債或還不了債則他與父親
是同類。
普通方法必須有方法塊,但是抽象方法可以沒有。抽象類不一定有抽象方法但有抽象方法的一定是個抽象類,抽象方法的子類必須重寫。
final類不可被繼承而abstract類必須被繼承故兩者不相容。
普通方法不強制重寫,用abtract父類強制重寫,但是如子類也是抽象類則可以不用重寫。子類不是抽象類則必須重寫。抽象父類的抽象方法必須要有人還賬,由非抽象類還
抽象類也可以還但不強制,總之必須要有子類還清。
所有的類都可以有構造方法但是並不是所有的構造方法都可以被例項化,abstract就不可被例項化。
注意:
抽象類不一定要包含抽象方法,若類中包含了抽象方法,則該類必須被定義為抽象類
構造方法、靜態方法、私有方法、final方法不能被宣告為抽象的方法。
2.介面(一種特殊的抽象類)
介面是抽象方法和常量值的定義的集合。
這種抽象類中只能包含常量和方法的定義,而沒有變數和方法的實現。
介面描述不同物件行為。
介面是一個標準也是一個契約。
介面的好處:
(1)通過介面實現不相關類的相同行為,而無需考慮這些類之間的關係.
(2)通過介面指明多個類需要實現的方法
(3)通過介面瞭解物件的互動介面,而無需瞭解物件所對應的類
介面的宣告語法:
[public] interface介面名稱[extendslistOfSuperInterface]{ … }
介面體包括常量定義和方法定義
常量定義: typeNAME=value;
該常量被實現該介面的多個類共享;
具有public ,final, static的屬性.即宣告一個介面後若不在常量前加public static final則也預設為此。
方法體定義:具有 public和abstract屬性,即預設為公開抽象方法。常量一般是大寫。
介面的實現類:
與抽象類一樣,介面要使用也必須通過子類,子類通過implements關鍵字實現介面
一個類可以實現多個介面,在implements子句中用逗號分開
非抽象子類必須實現介面中定義的所有方法
實現格式:
class子類 implements介面A,介面B…{
}注意:
類和類之間繼承是單繼承
介面和類之間使用實現(implements),可以多實現。
介面的方法全為抽象方法,抽象類裡可以有抽象方法也可以沒有。
介面和抽象類都不可被例項化。
父介面和子介面之間是繼承,但是可以繼承很多個父介面。
類既繼承一個父類又要實現一個介面也可以,此時繼承和實現都要寫。