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. 屬性有多型嗎?
沒有.