1. 程式人生 > >Java的final和多型

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


沒有.