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

Java的final和多態

控制 [] bridge pri hang 無法 兼容 訪問控制權限 ...

*************************簡述一下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和多態