1. 程式人生 > >父類物件到底能不能強制轉換為子類物件

父類物件到底能不能強制轉換為子類物件

首先是可以的。前提是:此父類物件為子類物件強轉的結果 例如:
  Father father = (Father)son;
當這種情況時,可以用instanceof判斷是否是子類型別(實際) 然後強轉回去
  if(father instanceof Son)
     Son son =(Son)father;

除此之外,不行。

往深了講。子類強制轉換為父類物件時,並沒有實際丟失它原有記憶體空間(比父類多的那些部分)只是暫時不可訪問。所以能再轉回來。
  另:父類物件可接受任何子類物件--此時發生自動轉型--》轉為父類型別--》所以能夠再轉回來。用instanceof 是防止錯誤的一種方式。

另外,參考如下部落格內容:

https://www.cnblogs.com/hanbin/p/4780607.html

之前徒弟問了一個問題, 在Java中, 父類物件到底能不能轉換成對應的子類物件?

到底能不能, 今天就來說說這個問題, 先看下面一段程式碼:

複製程式碼
package cn.com.hanbinit.test;
/**
 * 檢驗父類是否可以強轉為子類
 * @author icer
 *
 */
public class ConvertPro extends Father {

    public static void main(String[] args) {
        Father father = new
Father(); Father father1 = new ConvertPro(); ConvertPro son = new ConvertPro(); // ConvertPro son1 = (ConvertPro) new Father(); // son = (ConvertPro)father; son = (ConvertPro) father1; } } /** * 父類 * * @author icer * */ class Father { private String name;
public String getName() { return name; } public void setName(String name) { this.name = name; } }
複製程式碼

上面程式碼註釋掉的兩行是會執行錯誤的. 根據程式碼顯示,  只有我們的父類物件本身就是用子類new出來的時候, 才可以在將來被強制轉換為子類物件.

子類繼承父類的所有(包括屬性以及方法), 也就是說子類包含的內容應該是比父類要大的. 如果正常環境下, 把一個父類轉換成子類一定會損失精度.  但是如果父類物件本身就是用

子類去new出來的, 就類似於一個本來就是兒子角色的人, 去裝了一會兒父親, 這個角色是可以在未來轉換回去的, 但是一個父親, 永遠不可能去裝兒子的.


相關推薦

物件到底強制轉換物件

首先是可以的。前提是:此父類物件為子類物件強轉的結果 例如:  Father father = (Father)son;當這種情況時,可以用instanceof判斷是否是子類型別(實際) 然後強轉回去  if(father instanceof Son)     Son s

C++強制轉換用法

-----Base.h #ifndef _BASE_H_ #define _BASE_H_ #include<iostream> using namespace std; class subclass; class base { public: int a;

java 強制轉換

JAVA中父類只有一種情況可以轉換為子類,就是物件本身引用的就是子類,如: public class Persion {} public class Man extends Persion {} Persion p =

C#強制轉換,隱式轉換

即Person p = new Student();  這種情況下可以把P物件強制轉換。你可能會問  這樣就是建立的一個student物件 我幹嘛不用student去建立? 這時候就是面向物件的程式設計的理解了。比如:我的一個方法的引數需要傳入一個學生,那麼你只能傳入一個student ,可是如果我的引數可

c# yyyyMMdd,dd/MM/yyyy 型字符串轉換datetime

ring getc esp oda pac hit 類型 time lob DateTime ConvertDate = Convert.ToDateTime(DateTime.ParseExact(item.Key, "yyyyMMdd", null, System.G

java將JSON字串轉換實體物件,基於net sf json實現

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

無法將型別“DAL.LoginDAL”的物件強制轉換型別“IDAL.ILogin”的解決方法

   無法將型別為“DAL.LoginDAL”的物件強制轉換為型別“IDAL.ILogin”      解決方法:         1.執行後Factory

無法將型別“*Class”的 COM 物件強制轉換介面型別 失敗原因.

在用.net2.0呼叫COM的某方法時報: System.InvalidCastException: 無法將型別為“*Class”的 COM 物件強制轉換為介面型別“I*”。此操作失敗的原因是對 IID 為“{BBB9E30B-B4EB-4560-B5A7-1B59B33EF

無法將型別“Shell32.ShellClass”的 COM 物件強制轉換介面型別“Shell32.IShellDispatch 6”

今天想研究一下mp3 然後在輸出mp3長度的時候用瞭如下程式碼(網上搬得): string file = "D:\\AccountDaemon\\My Music\\MyMusics\\Luxtos.mp3"; ShellClass sh = new

【Winform】 無法將型別“System.Windows.Forms.SplitContainer”的物件強制轉換型別“System.ComponentModel.ISupportInitialize”。

問題:將dotnet framework 4.0 切換到2.0時,編譯沒有問題,在執行時出現如下錯誤:System.InvalidCastException: 無法將型別為“System.Windows

關於java介面、之間呼叫和強制轉換的關係

如果使用介面的引用去方位它的實現類的方法,那麼一定只能訪問實現類中介面所定義的那個方法,其他的變數和方法是無法訪問的 如果使用父類的引用去訪問子類的方法例如,A是個父類,b繼承了A,那麼如果A did= new b();那麼did只能訪問A類和b類共有的部分,如果想 訪問b

C# 無法將“__DynamicallyInvokableAttribute”的對象強制轉換型...

!= 遍歷 col all 修改 https 強制 nbsp clas 錯誤代碼: //遍歷方法特性 foreach (MethodInfo m in type.GetMethods()) {

object轉換Array

... logs .... cnblogs div continue fun value nbsp var obj = {a: 1, b: 2, c: 3}; // .... var arr = []; for(var key in obj){ if(!ob

VS2013 中 CString轉換LPCSTR

結構 version truct true ast fin blog logs lpcstr     HWND hWnd = ::FindWindow(NULL, L"XXXXXXX"); if (hWnd != NULL) { DWORD dwReadB

34 char轉換int

print size str div class %d 為什麽 log iostream #include<iostream> #include<cstdlib > using namespace std; int main() {

js把String轉換日期並計算

ber blog mon default getdate ase nds seconds 0.00 //計算日期加法 function DateAdd(interval, number, date) { switch (interval) { case "

使用@import導入實現了ImportBeanDefinitionRegistrar接口的,不被註冊bean

sage lur watch ref java throw 根據 lib spa 今天在調試公司spring項目的時候發現了這樣一個問題,由於我們的項目使用的是springboot就以springboot為例,代碼如下: @Import({DataSourceRegi

將實體、匿名對象轉換SqlParameter列表

ins 名稱 rem return parameter 實體 mark continue rar /// <summary> /// <remarks> /// <para>將實體類/匿名對象轉換為SqlParameter列表</

double轉換int型四舍五入工具

for java pack bsp ceil string class col 小數 package com.qiyuan.util; import java.math.BigDecimal; import java.text.DecimalFormat; publi