Java的final和多態
*************************簡述一下final(面試題)*********************************
一.修飾變量
1. 基本類型
final double PI = 3.14;// 最終變量 表示常量 只能被賦值一次
PI = 3.15;//編譯報錯 無法為最終變量PI分配值
2.引用類型
final String s = "aaa";//最終引用 表示s只能引用 "aaa" 不能再引用其他對象了
s = "bbb";//編譯報錯
二. 修飾類
最終類 最終類不能被繼承 相當於類的最終版本
程序員如果編寫一個類,不想讓別人繼承,可以使用final 修飾這個類
一般jdk中的類 都是最終類 String、Integer、System..
final public class Bird{
}
三.修飾方法
修飾方法 最終方法
最終方法不能被重寫
***************************************最終方法可以被繼承嗎???*******************************
可以被繼承. 能不能被繼承 和final沒關系, 能不能被繼承是看 訪問控制權限修飾符..
***************************************向上轉型******************************************
向上轉型: 建立在繼承的基礎上, 把子類型的對象 賦值給父類型的引用。 可以理解成 引用類型的寬轉換
向上轉型會 "丟失" 子類 獨有的行為
演示代碼:
package com.chapter8.演示向上轉型;
/**
* 作者: zhangzy
* 公司: 藍橋軟件學院
* 時間: 2017年7月6日 下午3:11:21
* 功能: 演示向上轉型
* 向上轉型: 把子類的對象 賦值給父類的引用 叫做向上轉型
*
* 向下轉型: 父類型的引用 賦值給 子類型的引用
*/
public class Teacher extends Person{
public void teach(){
System.out.println("講課");
}
public static void main(String[] args) {
Person person = new Teacher();
/* Teacher teacher = new Teacher();
Person person = teacher;//向上轉型 是安全的 自動的
*/
//向上轉型 會 "丟失" 子類獨有的行為
//父類型 不能調用 子類中獨有的方法
//person.teach();
//Teacher teacher2 = (Teacher)person;//向下轉型 不安全的 也不是自動的
//ClassCastException 運行的時候拋出一個異常 類轉換異常
//Teacher cannot be cast to Student
//Student student = (Student)person;
}
}
*************************************多態*********************************
一.why
好處: 可以寫出 可維護的 通用性代碼,能應對需求的不斷變化...
public class BlueBridgeCollege{
public void makeTeacherWork(JavaTeacher teacher){
teacher.teach();
}
}
一開始藍橋軟件學院只教java,讓老師工作的方法需要定義 JavaTeacher 類型,業務擴容以後
又講CSharp,以前的方法不能滿足需求了,需要再添加一個方法
public void makeTeacherWork(CSharpTeacher teacher){
teacher.teach();
}
如果講100門課,需要編寫100個類似的方法,顯然是比較傻.如何解決??
其實這100個方法方法,區別在於類名不同,有沒有一種類型,可以兼容100種類型?
是有的.父類型
用多態來解決這個問題
二. what 什麽是多態
一份代碼、多種形態. 以1當10,以1當100
多態: 實例方法的動態綁定...、動態聯編、後期綁定....
綁定: 給定一個方法名,通過該方法名決定到底執行哪塊代碼的過程叫做綁定...
動態綁定: 運行的時候 決定 到底執行哪一塊代碼...
根據傳入對象的不同,傳入的是javaTeacher對象 調用javaTeacher對象的teach() 打印 我在講java
//傳入的是csharpTeacher對象 調用csharpTeacher對象的teach() 打印 我在講c#
三. how 編寫多態的代碼
1. 定義一個父類型(父類、抽象類、接口)
2. 定義一個子類型
(1)子類來繼承父類 重寫父類的方法
(2)子類繼承抽象類 重寫抽象類的方法
(3)子類實現接口 實現接口的方法
3. 定義一個測試方法, 方法的參數一定要是 父類型
運行的時候 傳入子類的對象
***************************************幾個小的面試題*****************************************
1.靜態方法有多態嗎??
沒有.靜態方法是靜態綁定的, 不管運行的時候傳哪個對象,都是調用的父類型的方法..
2. private 修飾的方法有多態嗎?
沒有.
3.final 修飾的方法有多態嗎??
沒有
4. 屬性有多態嗎?
沒有.
Java的final和多態