-
1、多態:
-
- 多態指的是同一個方法的調用,由於對象不同可能會有不同的行為。現實生活中,同一個方法,具體實現完全不同。
-
- 多態的要點:
-
-
- (1)多態是方法的多態,不是屬性的多態(多態與屬性無關);
-
-
-
- (2)多態的存在要有3個必要條件:繼承、方法重寫、父類引用指向子類對象;
-
-
-
- (3)父類引用指向子類對象后,用該父類引用調用子類重寫的方法,此時多態就出現了。
-
/**
* - - - (1)多態是方法的多態,不死屬性的多態(多態與屬性無關);
* - - - (2)多態的存在要有3個必要條件:繼承、方法重寫、父類引用指向子類對象;
* - - - (3)父類引用指向子類對象后,用該父類引用調用子類重寫的方法,此時多態就出現了
*
*
*/
public class TestPolm {
public static void main(String[] args) {
Animal a = new Animal();
animalCry(a);
Dog dog = new Dog();
animalCry(dog);
Cat cat = new Cat();
animalCry(cat);
Animal cat2 = new Cat();
animalCry(cat2);
}
static void animalCry(Animal a){
a.shut();
}
}
class Animal{
public void shut(){
System.out.println("叫了一下!");
}
}
class Dog extends Animal{//繼承條件滿足
public void shut(){//方法重寫條件滿足
System.out.println("汪汪汪");
}
}
class Cat extends Animal{//繼承條件滿足
public void shut(){//方法重寫條件滿足
System.out.println("喵喵喵");
}
}
/**運行結果:
* 叫了一下!
* 汪汪汪
* 喵喵喵
* 喵喵喵
*/
-
2、繼承使用要點:
-
- 父類也稱作超類、基類等;
-
- java中只有單繼承,沒有C++那樣的多繼承。多繼承會引起混亂,使得繼承過於復雜,系統難於維護;
-
- java中類沒有多繼承,接口有多繼承;
-
- 子類繼承父類,可以得到父類的全部屬性和方法(除了父類的構造方法),但不見得可以直接訪問(比如,父類私有的屬性和方法);
-
- 如果定義一個類時,沒有調用extends,則它的父類時:java.lang.Object。
-
3、instanceof運算符:
-
- instanceof是二元運算符,左邊是對象,右邊是類;當對象時右邊類或子類所創建的對象時,返回true;否則,返回false。
public class Test{
public static void main(String[] args) {
Student s = new Student();
System.out.println(s instanceof Person); //Student 繼承自Person
System.out.println(s instanceof Student);
}
}
-
4、向上自動轉型,向上強制轉型:
public class TestPolm {
public static void main(String[] args) {
Animal cat = new Cat();//自動向上轉型
animalCry(cat);
Cat cat2 = (Cat)cat; //強制向下轉型
}
static void animalCry(Animal a){
a.shut();
}
}
class Animal{
public void shut(){
System.out.println("叫了一下!");
}
}
class Dog extends Animal{//繼承條件滿足
public void shut(){//方法重寫條件滿足
System.out.println("汪汪汪");
}
}
class Cat extends Animal{//繼承條件滿足
public void shut(){//方法重寫條件滿足
System.out.println("喵喵喵");
}
}
-
5、父類的普通方法可以被繼承和重寫,不多作解釋,如果子類繼承父類,而且子類沒有重寫父類的方法,但是子類會有從父類繼承過來的方法。
-
- 靜態的方法可以被繼承,但是不能重寫。 如果父類中有一個靜態的方法,子類也有一個與其方法名,參數類型,參數個數都一樣的方法,並且也有static關鍵字修飾,那么該子類的方法會把原來繼承過來的父類的方法隱藏,而不是重寫。通俗的講就是父類的方法和子類的方法是兩個沒有關系的方法,具體調用哪一個方法是看是哪個對象的引用;這種父子類方法也不在存在多態的性質。《Java編程思想》中這樣提到“只有普通的方法調用可以是多態的”。下面代碼為例:
public class StaticTest
{
public static void main(String[] args)
{
M m = new N();
m.output();
}
}
class M
{
public static void output()
{
System.out.println("M");
}
}
class N extends M
{
public static void output()
{
System.out.println("N");
}
}
上面執行的結果是“M”,也就是是M類型的引用調用的,如果修改main方法中的代碼:
N n = new N();
n.output();
那么執行的結果是“N”,也就是N類型的引用調用的。
-
6、子類能繼承父類的所有成員,使用反射可以看出子類是繼承了父類的私有方法的(不管是否是final),只是直接調用父類的私有方法是不可以的,但是利用反射的方式可以調用。字段同理。
-
7、方法的重寫和重載:
-
重載,簡單說,就是函數或者方法有相同的名稱,但是參數列表不相同的情形,這樣的同名不同參數的函數或者方法之間,互相稱之為重載函數或者方法。
-
- (1)方法重載是讓類以統一的方式處理不同類型數據的一種手段。多個同名函數同時存在,具有不同的參數個數/類型。重載Overloading是一個類中多態性的一種表現。
-
- (2) Java的方法重載,就是在類中可以創建多個方法,它們具有相同的名字,但具有不同的參數和不同的定義。調用方法時通過傳遞給它們的不同參數個數和參數類型來決定具體使用哪個方法, 這就是多態性。
-
- (3) 重載的時候,方法名要一樣,但是參數類型和個數不一樣,返回值類型可以相同也可以不相同。無法以返回型別作為重載函數的區分標准。
-
在面向對象編程中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類並不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要采用方法的重寫。方法重寫又稱方法覆蓋。
-
- (1)父類與子類之間的多態性,對父類的函數進行重新定義。如果在子類中定義某
方法與其父類有相同的名稱和參數,我們說該方法被重寫(Overriding)。在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類並不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要采用方法的重寫。方法重寫又稱方法覆蓋。
- (1)父類與子類之間的多態性,對父類的函數進行重新定義。如果在子類中定義某
-
- (2)若子類中的方法與父類中的某一方法具有相同的方法名、返回類型和參數表,則新方法將覆蓋原有的方法。如需父類中原有的方法,可使用super關鍵字,該關鍵 字引用了當前類的父類。
-
- (3)子類函數的訪問修飾權限不能少於父類的;
需要重寫方法是因為:父類的功能無法滿足子類的需求。
方法重寫的前提: 必須要存在繼承的關系。
方法的重寫: 子父類出了同名的函數,這個我們就稱作為方法的重寫。
什么是時候要使用方法的重寫:父類的功能無法滿足子類的需求時。
方法重寫要注意的事項:
-
- 1.方法重寫時, 方法名與形參列表必須一致。
-
- 2.方法重寫時,子類的權限修飾符必須要大於或者等於父類的權限修飾符。
-
- 3.方法重寫時,子類的返回值類型必須要小於或者 等於父類的返回值類型。
-
- 4.方法重寫時, 子類拋出的異常類型要小於或者等於父類拋出的異常類型。
-
-
- Exception(最壞)
-
-
-
- RuntimeException(小壞)
-
方法的重載:在一個類中 存在兩個或者兩個 以上的同名函數,稱作為方法重載。
方法重載的要求
-
-
- 函數名要一致。
-
-
-
- 形參列表不一致(形參的個數或形參 的類型不一致)
-
-
-
- 與返回值類型無關。
-
-
8、關於構造方法:
-
- 構造方法不能被static、final、synchronized、abstract、native修飾,但可以被public、private、protected修飾;
-
- 構造方法不能被繼承
