標籤:提升 重載 執行個體化 static rgs 相關 開發 nbsp ati
1.Java抽象類別
1.抽象類別的相關概念
如果一個類中沒有包含足夠的資訊來描繪一個具體的對象,這樣的類就是抽象類別。
如形狀類是抽象的類,圓、三角形等是具體類。
用abstract修飾的類就是抽象類別。如果某個類中包含有抽象方法,那麼該類就必須定義成抽象類別。但是抽象類別中不一定有抽象方法。
2.用abstract修飾的類就是抽象類別。如果某個類中包含有抽象方法,那麼該類就必須定義成抽象類別。
抽象類別可以有成員屬性和非抽象的成員方法。
抽象類別不能被執行個體化,但可以有建構函式。
抽象類別只能用作基類,表示的是一種繼承關係。繼承抽象類別的非抽象類別必須實現其中的所有抽象方法,而已實現方法的參數、傳回值要和抽象類別中的方法一樣。否則,該類也必須聲明為抽象類別。
3.使用關鍵字abstract定義抽象類別,一般文法:
[存取權限] abstract class 類名 {成員列表}
4.抽象類別的注意事項
抽象類別可以有構造方法,但不能直接執行個體化,只能用來繼承;
抽象類別的派生子類應該提供對其所有抽象方法的具體實現;如果抽象類別的派生子類沒有實現其中的所有抽象方法,那麼該派生子類仍然是抽象類別,只能用於繼承,而不能執行個體化;
抽象類別中也可以包含有非抽象的方法,子類中重寫非抽象方法時傳回值和參數必須與父類一致;
構造方法和靜態方法不可以修飾為abstract。
2.Java抽象方法
1.抽象方法的相關概念
在某些情況下,類無法(或者沒有必要)提供方法的具體實現,可以將此方法聲明成抽象方法;
在類中沒有方法體的方法,就是抽象方法;
含有抽象方法的類,一定是抽象類別。
2.使用關鍵字abstract聲明抽象方法,一般文法:
[存取權限] abstract 傳回值類型 方法名稱(參數列表);
3.抽象的作用
1.在物件導向領域,抽象類別主要用來進行類型隱藏;也就是使用抽象的類型來編程,但是具體運行時就可以使用具體類型。
利用抽象的概念,能夠在開發項目中建立擴充性很好的架構,最佳化程式。
抽象類別,抽象方法,在軟體開發過程中都是設計層面的概念。也就是說,設計人員會設計出抽象類別,抽象方法,程式員都是來繼承這些抽象類別並覆蓋抽象方法,實現具體功能。
4.多態性
1.多態性是物件導向的三大特徵之一
多態的含義是:對外一種表現形式,內在有多種具體實現。
Java中多態的具體體現
方法重載
方法覆蓋
多態參數(新內容,重點、痛點)
5.運行期類型與編譯期類型
1.第一種情況:編譯期類型和運行期類型相同
A a = new A();
a.show();
聲明A的時候,使用到的類型A表示對象的類型,被稱為編譯期類型,在編譯期,虛擬機器認為a的類型是A,對於a所使用的屬性和方法的有效性將到類A中去驗證。
構造方法A()中的A是運行期類型,在運行期,將執行運行期類型中的方法。
2.第二種情況:當有繼承關係時,可能發生編譯期類型和運行期類型不同的情況,即編譯期類型是父類類型,運行期類型是子類類型。
//A類是B類的父類
A ab = new B();
ab.show();
對象ab的編譯期類型為父類A類,運行期類型為子類B類。
如果一個引用的編譯期類型和運行期類型不同,那麼一定是編譯期類型與運行期類型有父類子類別關係。
ab對象使用的方法,在編譯期到類A中去校正,而運行則執行B類的方法
如果一個對象的編譯期類型是父類,運行期類型是子類,可以對該對象進行強制類型轉換,將其編譯器類型轉換為與運行期類型相同的類型,即:B b=(B)ab;
6.父類引用指向子類對象
1.當編譯器類型是父類,運行期類型是子類時,被稱為父類引用指向子類對象
public class Father {
void study() {
this.strXchinaese="小學語文";
System.out.println("我在學"+this.strXchinaese);
}
}
public class Son extends Father {
void study() {
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Father fa=new Son("456");
fa.study();
}
}
對象Father可以調用Son類中的所有方法,fa只能調用Father中定義的方法,
Son擴充的新方法不能調用。
7.多態環境下對屬性和方法的調用
1.多態環境下對成員方法的調用
public class Father {
void study() {
this.strXchinaese="小學語文";
System.out.println("我在學"+this.strXchinaese);
}
}
public class Son extends Father {
void study() {
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Father fa=new Son("456");
fa.study();
}
}
簡單的說:編譯看左邊,運行看右邊。
2.多態環境下對靜態成員方法的調用public class Father {
static void study() {
this.strXchinaese="小學語文";
System.out.println("我在學"+this.strXchinaese);
}
}
public class Son extends Father {
static void study() {
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Father fa=new Son("456");
fa.study();
}
}
簡單的說:編譯和運行都看左邊。
3.多態環境下對成員變數的調用
public class Father {
int a=100;
void study() {
this.strXchinaese="小學語文";
System.out.println("我在學"+this.strXchinaese);
}
}
public class Son extends Father {
int a=200;
void study() {
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Father fa=new Son("456");
fa.study();
}
}
簡單的說:編譯和運行都看等號左邊。
注意:變數不存在被子類覆寫這一說法,只有方法存在覆寫
8.多態參數
1.方法參數具有多態性
public class Animal {
void eat() {
System.out.println("動物吃食物");
}
}
public class Cat extends Animal{
void eat() {
System.out.println("貓吃貓糧");
}
}
public class Dog extends Animal{
void eat() {
System.out.println("狗吃肉");
}
}
public class Main1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//Animal animal = new Animal();
Cat cat=new Cat();
Dog dog=new Dog();
/*cat.eat();
dog.eat();*/
method(dog);
method(cat);
}
static void method(Animal animal) {
animal.eat();
}
}
方法多重參數變形性的好處:提高代碼的擴充性
9.多態環境下對象造型
1.向上造型 –又稱自動型別提升
public class Father {
void study() {
this.strXchinaese="小學語文";
System.out.println("我在學"+this.strXchinaese);
}
}
public class Son extends Father {
void study() {
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Father fa=new Son("456");
fa.study();
}
}
只能使用父類中的方法
2.向下造型 –又稱向下轉型
public class Father {
void study() {
this.strXchinaese="小學語文";
System.out.println("我在學"+this.strXchinaese);
}
}
public class Son extends Father {
void study() {
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Son son=new Father("456");
son.study();
}
}
子父類中的方法都可以使用
10.instanceof 操作符
1.instanceof 用法
result = 對象名稱 instanceof 類型
參數:
result:布爾類型。
對象名稱:必選項,任意對象運算式。
類型:必選項,任意已定義的類,可以是API中的類,可以是自訂的類。
說明:
如果對象是這個類型的一個執行個體,則 instanceof 運算子返回 true。如果對象不是指定類的一個執行個體,或者對象是 null,則返回 false
instanceof 運算子是用來在運行時指出對象是否是特定類的一個執行個體
public class Animal {
void eat() {
System.out.println("動物吃食物");
}
}
public class Cat extends Animal{
void eat() {
System.out.println("貓吃貓糧");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//Animal animal = new Animal();
Cat cat=new Cat();
Dog dog=new Dog();
/*cat.eat();
dog.eat();*/
method(dog);
method(cat);
}
static void method(Animal animal) {
if(animal instanceof Cat) {
Cat c= (Cat)animal;
c.eat();
}
}
java的抽象、多態