Java對象類型轉(zhuǎn)換實現(xiàn)方式(向上轉(zhuǎn)型與向下轉(zhuǎn)型)
一.概念
1.類型轉(zhuǎn)換
將一個類型強制轉(zhuǎn)換成另一個類型的過程被稱為類型轉(zhuǎn)換。
2.繼承
繼承是面向?qū)ο笳Z言中一個代碼復(fù)用的機制,Java中的繼承就是在已經(jīng)存在類的基礎(chǔ)上進行擴展,從而產(chǎn)生新的類。
已經(jīng)存在的類稱為父類(也叫基類或者超類),新產(chǎn)生的類稱為子類(也叫派生類),子類繼承了父類中的非私有屬性和可以繼承的方法(可以重寫),子類可以繼續(xù)擴展自己的屬性及方法。
3.對象類型轉(zhuǎn)換
對象類型轉(zhuǎn)換,是指存在繼承關(guān)系的對象,不是任意類型的對象。
Java語言允許某個類型的引用變量引用子類的實例,而且可以對這個引用變量進行類型轉(zhuǎn)換。
Java中引用類型之間的類型轉(zhuǎn)換(前提是兩個類是父子關(guān)系)主要有兩種,分別是向上轉(zhuǎn)型和向下轉(zhuǎn)型。
(1)向上轉(zhuǎn)型
父類引用指向子類對象為向上轉(zhuǎn)型,即通過子類對象(小范圍)實例化父類對象(大范圍),這種屬于自動轉(zhuǎn)換,形式如下:
FatherClass f = new SonClass();
使用向上轉(zhuǎn)型可以調(diào)用父類類型中的所有成員,不能調(diào)用子類類型中特有成員。
(2)向下轉(zhuǎn)型
子類對象指向父類引用為向下轉(zhuǎn)型,即通過父類對象(大范圍)實例化子類對象(小范圍),這種屬于強制轉(zhuǎn)換,形式如下:
SonClass s = (SonClass) f;
使用向下轉(zhuǎn)型可以調(diào)用子類類型中所有的成員。
注意:
如果父類引用對象是子類對象,那么在向下轉(zhuǎn)型的過程中是安全的;
如果父類引用對象是父類本身,那么在向下轉(zhuǎn)型的過程中是不安全的,編譯不會出錯,但是運行時會拋出Java強制類型轉(zhuǎn)換(java.lang.ClassCastException)異常,我們一般使用instanceof運算符來避免出此類錯誤。
(instanceof運算符用于判斷該運算符前面引用類型變量指向的對象是否是后面類或者是其子類、接口實現(xiàn)類創(chuàng)建的對象,如果是則返回true,否則返回false)
二.示例
//先寫一個父類
class Transport{
String transportName = "交通工具";
public void run(){
System.out.println("我正在運行");
}
}
//再給他寫一個子類
class Car extends Transport{
String transportName = "車";
static String transportType = "特斯拉";
public void runType(){
System.out.println("我在地上跑");
}
public static void main(String[] args) {
Transport transport1 = new Car(); //向上轉(zhuǎn)型,將Car類型轉(zhuǎn)為Transport類型
System.out.println(transport1.transportName); //輸出"交通工具"
transport1.run(); //輸出"我正在運行"
//但是transport1不能調(diào)用Car中的runType()方法,因為向上轉(zhuǎn)型可以調(diào)用父類類型中的所有成員,不能調(diào)用子類類型中的特有成員
System.out.println("==============我是分割線===============");
Transport transport2 = new Car();
if (transport2 instanceof Car){
Car car = (Car) transport2; //向下轉(zhuǎn)型,將Transport類型轉(zhuǎn)為Car類型
//car可以調(diào)用Car中所有的成員
System.out.println(car.transportName); //輸出"車"
System.out.println(car.transportType); //輸出"特斯拉"
car.run(); //輸出"我正在運行"
car.runType(); //輸出"我在地上跑"
}
}
}
交通工具 我正在運行 ==============我是分割線=============== 車 特斯拉 我正在運行 我在地上跑
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
java中將科學(xué)計數(shù)法轉(zhuǎn)換普通計數(shù)法的簡單方法
下面小編就為大家?guī)硪黄猨ava中將科學(xué)計數(shù)法轉(zhuǎn)換普通計數(shù)法的簡單方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
Java向數(shù)據(jù)庫中插入數(shù)據(jù)后獲取自增ID的常用方法
有時候因為新增的需求需要獲取剛剛新增的數(shù)據(jù)的自增的主鍵ID,下面這篇文章主要給大家介紹了關(guān)于Java向數(shù)據(jù)庫中插入數(shù)據(jù)后獲取自增ID的常用方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
Java并發(fā) synchronized鎖住的內(nèi)容解析
這篇文章主要介紹了Java并發(fā) synchronized鎖住的內(nèi)容解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09
SpringBoot3實現(xiàn)數(shù)據(jù)備份操作的多種方法全解析
在當(dāng)今數(shù)字化時代,數(shù)據(jù)已然成為企業(yè)最為寶貴的資產(chǎn)之一,Spring Boot 3 作為一款廣受歡迎的 Java 開發(fā)框架,為我們實現(xiàn)高效、可靠的數(shù)據(jù)備份操作提供了豐富的工具與便捷的方式,下面我們就來看看具體實現(xiàn)方法吧2025-12-12
java使用Socket實現(xiàn)SMTP協(xié)議發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了java使用Socket實現(xiàn)SMTP協(xié)議發(fā)送郵件的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-05-05
Mybatis動態(tài)查詢字段及表名的實現(xiàn)
本文主要介紹了Mybatis動態(tài)查詢字段及表名的實現(xiàn),通過靈活運用Mybatis提供的動態(tài)SQL功能,我們可以構(gòu)建更加靈活、高效的查詢語句,具有一定的參考價值,感興趣的小伙伴們可以參考一下2024-01-01

