一.多態
定義:多態指一個事物在不同時刻體現出來的不同狀態
1)多態存在的三個必要條件
1.要有繼承;
2.要有重寫;
方法重寫:要求返回值類型也要相同的.不能改變返回值類型
3.父類引用指向子類對象。(向上轉型)(三者缺一不可,必須熟記)
2)多態的成員訪問特點:
成員變量:
編譯看左邊,運行看左邊
成員方法:
編譯看左,運行看右;由於存在方法重寫,所以就運行最終的就是子類的成員方法
靜態成員方法:
編譯看左,運行看左
構造方法:還是對象進行初始化,由於是一種繼承關係,還是分層初始化!
3)多態的好處及弊端?如何解決多態的弊端?
多態的好處:
a.提高代碼的維護性 多態對已存在代碼具有可替換性(由繼承保證)
b.提高代碼的擴展性(由多態保證)
c.多態簡化對應用軟件的代碼編寫和修改過程
多態的弊端:
不能訪問子類的特有功能
解決方案:
a.創建子類的具體對象,來訪問自己的特有功能;雖然可以解決多態的弊端,但是從內存角度考慮,需要創建子類對象,那麼必須在堆內存開闢空間,
b.將子類的引用指向父類對象即向下轉型:將父類的引用強制轉換爲子類的引用(前提必須有父類的引用存在);
Java中多態的實現方式:接口實現,繼承父類進行方法重寫,同一個類中進行方法重載。
關於轉型:
比如有2個類 A B A繼承B 先 B b = new B(); 這個時候 A a = b; 這種用法就是向上轉型 使用父類的引用 引用子類對象 向上轉型是自動的不需要其他操作 在上邊的基礎上 b = (B) a 這個就是向下轉型 當用父類引用 引用子類對象 現在想不使用父類的引用 而使用子類的引用 就是向下轉型 向下轉型必須強制轉型 必須確定對象確實是子類對象
關於final的問題
final關鍵字可以幹什麼?有什麼特點?
final關鍵字可以用來修飾類,修飾類的成員變量,修飾成員方法。
特點:如果修飾類則該類不能被繼承,如果修飾成員方法則改方法不能被重寫,如果修飾成員變量則該成員變量不能被修改。大多數情況,final一般跟public static一起使用!
3:final關鍵字的面試題?
A:修飾局部變量
B:初始化時機
A 基本數據類型:如果局部變量是基本數據類型被final修飾後,其值不能被改變。
引用數據類型:如果引用類型被final修飾,那麼就不能再重新分配堆內存空間,但可以改變成員變量的值!
B 初始化時機:構造代碼塊中可以進行初始化。
構造方法中可以進行初始化。
定義成員變量的時候可以進行初始
*局部內部類訪問局部變量時 該局部變量要作爲一個常量被final修飾
class Outer5{
//外部類的成員變量
// public int num = 100 ;
private int num = 100 ;
//外部類的成員方法
public void method(){
//局部變量
final int num2 = 200 ; //自定義常量(細節問題)
//局部位置
class Inner5{
//局部內部類的成員方法
public void show(){
System.out.println(num);
//局部內部類中訪問局部變量
System.out.println(num2); //jdk1.7纔會有這個錯誤! jdk1.8---->封裝好了,所以不會出現錯誤!
}
}
Inner5 i = new Inner5() ;
i.show() ;
}
}
二. 抽象類
概念:使用了關鍵詞abstract聲明的類叫作“抽象類“。如果一個類裏包含了一個或多個抽象方法,類就必須指定成abstract,當一個類中如果有抽象功能(抽象方法)的時候,那麼這個類一定要定義爲抽象類
:使用了關鍵詞abstract聲明的類叫作“抽象類“。如果一個類裏包含了一個或多個抽象方法,類就必須指定成abstract,當一個類中如果有抽象功能(抽象方法)的時候,那麼這個類一定要定義爲抽象類
1)抽象類成員特點? 1.抽象方法:沒有方法體的一個方法 public abstract void eat() ; 2.抽象的子類 abstract class Cat extends Animal{
1.抽象方法:沒有方法體的一個方法 public abstract void eat() ; 2.抽象的子類 abstract class Cat extends Animal{
}
抽象類的子類的特點: 抽象類的子類是抽象類,那麼沒有意義!最終使用的就是通過子類進行對象初始化的,如果子類都被抽象修飾了,那麼也不能創建對象,所以沒意義 2)關於抽象類:
抽象類的子類是抽象類,那麼沒有意義!最終使用的就是通過子類進行對象初始化的,如果子類都被抽象修飾了,那麼也不能創建對象,所以沒意義 2)關於抽象類:
a.一個抽象類如何進行實例化:
通過抽象類多態形式:父類的引用指向子類對象,通過子類進行初始化!
一個抽象類如何進行實例化:
通過抽象類多態形式:父類的引用指向子類對象,通過子類進行初始化!
b.一個抽象類中可以有非抽象方法嗎?
一個抽象類中可以抽象,也可以有非抽象的
c.抽象類不能實例化:抽象類不能創建對象
一個抽象類中可以有非抽象方法嗎?
一個抽象類中可以抽象,也可以有非抽象的
c.抽象類不能實例化:抽象類不能創建對象
3)抽象類多態:
強制子類必須重寫當前抽象的父類中所有的抽象方法
還可以提高代碼的維護性(裏面繼承關係保證!)
* 抽象類的小問題 A:一個類如果沒有抽象方法,可不可以定義爲抽象類?如果可以,有什麼意義? B:abstract不能和哪些關鍵字共存 A. 可以,不能讓創建對象。 B. final private static 和 abstract不能共存
三.接口
1).接口的概述及其特點?
1).接口的概述及其特點?
概述:接口體現的是一種擴展功能。 特點:接口裏面的方法只能是抽象方法。
Interface 接口名{
}
接口不能實例化,必須通過過子實現類進行初始化。因此子實現類不能爲抽象類,否則沒有意義。
class 子實現類名 implements 接口名{
}
2).接口的成員特點? 1.成員變量:
只能是常量:存下默認修飾符:public static final (永遠建議自己給出默認修飾符)
2.構造方法:
接口是沒有構造方法的
3.成員方法:
接口中的成員方法默認修飾符:public abstract
3).抽象類和接口的區別?
只能是常量:存下默認修飾符:public static final (永遠建議自己給出默認修飾符)
2.構造方法:
接口是沒有構造方法的
3.成員方法:
接口中的成員方法默認修飾符:public abstract
3).抽象類和接口的區別?
1.成員的區別:
成員變量:
抽象類:成員變量可以是常量,也可以是變量
接口:成員變量只能是一常量:存在默認修飾符:public static final
構造方法:
抽象類:可以有無參構造,有參構造方法
作用:通過子類進行數據初始化(通過子類創建對象)
接口:沒有構造方法的
成員方法的區別:
抽象類:可以有抽象方法,也可以有非抽象方法
接口:只能是抽象方法:存在默認修飾符:public abstract
2.關係的區別:
類與類的關係:
繼承關係:extends,java中只支持單繼承,不支持多繼承,但是可以多層繼承!
類與接口的關係:
實現關係:implements,並且,一個類在繼承另一個類的同時,可以實現多個接口
(class 子實現類名 enxtends Object implements 接口名1,接口名2...)
接口與接口的關係
繼承關係:extends,可以支持單繼承,也可以多繼承!
3.設計理念的區別:
抽象類:
體現的是一種"is a"的關係,存在繼承關係!(抽象類多態)
接口:
體現的是一種"like a"的關係,由於接口的一種擴展功能
*接口練習題
成員變量:
抽象類:成員變量可以是常量,也可以是變量
接口:成員變量只能是一常量:存在默認修飾符:public static final
構造方法:
抽象類:可以有無參構造,有參構造方法
作用:通過子類進行數據初始化(通過子類創建對象)
接口:沒有構造方法的
成員方法的區別:
抽象類:可以有抽象方法,也可以有非抽象方法
接口:只能是抽象方法:存在默認修飾符:public abstract
2.關係的區別:
類與類的關係:
繼承關係:extends,java中只支持單繼承,不支持多繼承,但是可以多層繼承!
類與接口的關係:
實現關係:implements,並且,一個類在繼承另一個類的同時,可以實現多個接口
(class 子實現類名 enxtends Object implements 接口名1,接口名2...)
接口與接口的關係
繼承關係:extends,可以支持單繼承,也可以多繼承!
3.設計理念的區別:
抽象類:
體現的是一種"is a"的關係,存在繼承關係!(抽象類多態)
接口:
體現的是一種"like a"的關係,由於接口的一種擴展功能
*接口練習題
老師和學生案例,加入抽菸的額外功能
分析:具體到抽象
學生:
成員變量:姓名,年齡
構造方法:有參/無參
成員方法
老師:
成員變量:姓名,年齡
構造方法:有參/無參
成員方法
人類:persen類:抽象類 eat();抽象功能
學生繼承自persen
老師繼承自persen
部分學生和老師具有吸菸功能:
接口: smoking 的抽象功能
實現:抽象到具體
成員變量:姓名,年齡
構造方法:有參/無參
成員方法
老師:
成員變量:姓名,年齡
構造方法:有參/無參
成員方法
人類:persen類:抽象類 eat();抽象功能
學生繼承自persen
老師繼承自persen
部分學生和老師具有吸菸功能:
接口: smoking 的抽象功能
實現:抽象到具體
package org.westos_08_接口; //測試類 public class Test { public static void main(String[] args) { SmokingStudent ss = new SmokingStudent(); ss.setName("吳彥祖"); ss.setAge(21); System.out.println(ss.getAge()+" "+ss.getName()); ss.sleep(); ss.eat(); ss.study(); ss.smoking(); System.out.println("---------------------"); //有參構造數據初始化 ss = new SmokingStudent("彭于晏",20); System.out.println(ss.getAge()+" "+ss.getName()); ss.sleep(); ss.eat(); ss.study(); ss.smoking(); } }