1、抽象程序員
一、抽象的相關概念編程
若是一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類.(如形狀是抽象的類,園、三角形是具體類)架構
用abstract修飾的類就是抽象類。若是某個類中包含有抽象方法,那麼該類就必須定義成抽象類。可是抽象類中不必定有抽象方法。函數
二、抽象類的定義優化
使用關鍵字abstract定義抽象類,語法spa
【訪問權限】abstract class 類名{設計
成員列表對象
}繼承
如:public abstract class Shape{開發
public abstract void draw();
}
public abstract class Shape{
public void draw(){
//具體代碼
}
}
三、抽象類的相關特性
用abstract修飾的類就是抽象類。類中包含有抽象方法,該類爲抽象類;
抽象類能夠有成員和非抽象的成員方法;
抽象類不能被實例化,但能夠有構造方法(函數),只能用來繼承;
抽象類只能用做基類,表示的是一種繼承關係;
繼承抽象的非抽象類必須實現其中的全部抽象方法已實現的方法的參數、返回值要和抽象類的方法同樣。不然,該類也必須聲明爲抽象類;
構造方法和靜態方法(static)不能夠修飾爲abstract。
四、抽象方法的概念
在某些狀況下,類沒法(或不必)提供方法的具體實現,能夠將此方法聲明成抽象方法;
在類中沒有方法體的方法,就是抽象方法;
含有抽象方法的類,必定是抽象類。
五、抽象方法的語法
使用關鍵字abstract聲明抽象方法,語法:
【訪問權限】abstract 返回值類型 方法名稱(參數列表);
public abstract void draw();
六、抽象的做用
在面向對象領域,抽象類主要用來進行類型隱藏;也就是使用抽象的類型來編程,具體運行時就可使用具體類型。
利用抽象的概念,可以在開發項目中建立擴展性很好的架構,優化程序。
抽象類,抽象方法,在軟件開發過程當中都是設計層面的概念。設計人員設計抽象類,抽象方法,程序員都是繼承這些抽象類並覆蓋抽象方法,實現具體功能。
2、多態性
多態性是面向對象的三大特徵之一
多態的含義是:對外一種表現形式,內在有多種具體實現
Java中多態的具體體現
--方法重載
--方法覆蓋
--多態參數
一、運行期類型與編譯期類型
第一種狀況:編譯期類型和運行期類型相同
A a = new A();
a . show();
聲明A的時候,使用到的類型A表示對象類型,被稱爲編譯期類型,在編譯期,虛擬機認爲a的類型是A,對於a所使用的屬性和方法的有效性將到類A中去驗證。
構造方法A()中的A是運行期類型,在運行期,將執行運行期類型中的方法。
第二種狀況:當有繼承關係時,可能發生編譯期類型和運行期類型不一樣的狀況,即編譯期類型是父類類型,運行期類型是子類類型。
//A類時B類的父類
A ab = new B();
ab . show();
對象ab的編譯期類型爲父類A類,運行期類型爲子類B類.
若是一個引用的編譯期類型和運行期類型不一樣,那麼必定是編譯器類型與運行期類型有父類子類關係.
ab對象使用的方法,在編譯期到類A中去校驗,而運行則執行B類的方法.
若是一個對象的編譯器類型是父類,運行期類型是子類,能夠對該對象進行強制類型轉換,將其編譯期類型轉換爲與運行期類型相同的類型,即: B b = (B) ab;
二、父類引用指向子類對象
當編譯期類型是父類,運行期類型是子類,被稱爲父類引用指向子類對象
class Animal{
.....
}
class Cat extends Animal{
.....
}
class Dog extends Ainmal{
.....
}
Cat m = new Cat();
Animal x = new Cat();//Animal的引用指向Cat的對象
對象m能夠調用貓類中的全部方法,x只能調用動物類中的定義的方法,貓類擴展的新方法不能調用。
三、多態環境下對成員方法的調用
class Animal {
void show(){
System.out.println(「Animal」);
}
}
class Cat extends Animal{
void show(){
System.out.println(「Cat」);
}
}
Animal x = new Cat();
x.show()//調用的是子類中的方法。
簡單的就是:編譯看左邊,運行看右邊。
四、多態環境下對靜態成員方法的調用
class Animal {
static void show(){
System.out.println(「Animal」);
}
}
class Cat extends Animal{
static void show(){
System.out.println(「Cat」);
}
}
Animal x = new Cat();
x.show()//調用的是動物類中的靜態成員方法。
簡單地說:編譯和運行都看左邊。
五、多態環境下隊成員變量的調用
class Animal{
int num = 3;
}
class Cat extends Animal{
int num = 2;
}
Animal x = new Cat;
x.num;//調用的是動物類中的成員變量
簡單地說:編譯和運行都看等號左邊。
注意:變量不存在被子類覆寫這一說法,只有方法存在覆寫。
六、多態參數
class Animal{
void eat(){
}
}
class Cat extends Animal{
void eat(){
}
}
class Dog extends Animal{
void eat(){
}
}
方法的形式參數 類型是父類,而傳遞的實際參數能夠是任意子類的對象
static void method(Animal animal){
animal.eat();
}
方法參數多態行的好處:提升代碼的擴展性。
七、多態環境下對象造型
向上造型
class Animal{
abstract void eat();
}
class Cat extends Animal{
void look(){
System.out.println(「看家」);
}
}
Animal x = new Cat();
x.eat() //只能使用父類中的方法
x.look()//報錯!不能使用子類中的方法
向上造型的做用是:提升程序的擴展性。
向下造型
class Animal{
abstract void eat();
}
class Cat extends Animal{
void look(){
System.out.println(「看家」);
}
}
Animal x = new Cat();
Cat m = (cat)x
m.eat();
m.look; //子父類中的方法均可以用
向下造型:爲了使用子類中的特有的方法。
3、instanceof操做符
instanceof用法
result = 對象名稱 instanceof 類型
參數:
result:布爾類型
對象名稱:必選項,任意對象表達式
類型:必選項,任意已定義的類,能夠是API中的類,能夠是自定義的類
說明:
若是對象是這個類型的一個實例,則 instanceof 運算符返回 true。若是對象不是指定類的一個實例,或者對象是 null,則返回 false。
instanceof 運算符是用來在運行時指出對象是不是特定類的一個實例。