java 物件型別轉換之父物件轉化為子物件
程式碼摘抄自《java就業培訓教程》——張孝祥老師。
簡單理一下上面的型別轉換過程:在第二個callA()方法時,傳遞給該方法的是一個B型別的物件。由於callA函式所接收的是一個A型別的物件,所以這裡進行了一次型別轉化(子型別物件轉換為父型別物件)。接下來到了if判斷那裡,程式判斷了一下a指向的物件是不是一個B型別的物件,結果是True,所以執行下面的程式碼。為了使用傳遞進來的物件,必須使用該物件的引用,也就是必須使用a,而a本身是A型別的引用,所以必須進行強制型別轉化,即 B b=(B) a;這一句。這時相當於新建了一個B型別的引用b,指向了傳遞進來的B型別的物件。這樣就可以使用傳進來的物件的所有屬性和方法了。class A{ public void func1(){ System.out.println("A func1 is calling"); } public void func2(){ func1(); } } class B extends A{ @Override public void func1() { System.out.println("B fun1 is calling"); } public void func3(){ System.out.println("B func3 is calling"); } } public class C { public static void main(String args []){ A a=new A(); callA(a); //a應用傳遞給callA callA(new B()); //直接把B物件做為一個A物件傳遞給函式 } public static void callA(A a){ if(a instanceof B){ //判斷a指向的物件型別是否是B型別的 B b=(B)a; //因為a指向的物件原來就是B型別的 b.func1(); //所以,這裡可以強制轉化,然後真的呼叫B型別的func3方法 b.func2(); b.func3(); }else{ a.func1(); a.func2(); } } }
從上面的過程就能看出來,強制型別轉化把父物件轉換成子物件,並不是把一個父物件真的補齊了子物件中多出的屬性或者方法使之成為一個真正的子物件,而是原本一個子物件的地址由於某種原因賦值給了一個父類的引用後,程式設計師很明確的知道這個父物件的引用指向的是一個子物件時,才可以使用強制型別轉化。
相關推薦
java 物件型別轉換之父物件轉化為子物件
程式碼摘抄自《java就業培訓教程》——張孝祥老師。 class A{ public void func1(){ System.out.println("A func1 is calling"); } public void func2(){ func1
java物件型別轉換
2018年11月05日 10:20:05 aprildusk 閱讀數:4 個人分類: java
C++ Pirmer : 第十四章 : 過載運算子與型別轉換之函式呼叫運算子與標準庫的定義的函式物件
函式呼叫運算子 struct test { int operator()(int val) const { return (i > 0 ? i : -i); } }; 所謂的函式呼叫就是一個類過載了函式呼叫符,類在使用過載函式呼叫符時接受相應引數。這一過程就像是使用
java中物件型別轉換
在java開發中我們經常見到的為了降低程式間的耦合度,在定義某些類是通常使用的都是父型別,之後程式呼叫者就可以根據自己的需求將子型別賦值上去,實現功能上的呼叫,在這過程中就是運用了物件的向上轉型,執行時通過後期繫結來實現對實際子類的呼叫。這樣就實現了傳說中java的多型功能。然而有些時候為了完成某
JAVA的物件型別轉換
JAVA中的物件型別轉換: 一、基類物件可以指向子類物件,但是不可以訪問子類物件新新增的成員 如下在執行testFunction()的時候,先在棧記憶體裡面定義一個animal 指向堆記憶體裡面new出來的Animal物件; 然後再執行第二句將animal指向新new出來的
JAVA小白系列之第二個分支:面向物件程式設計
想必剛入門的小白總是搞不清楚面向物件和麵向過程這兩個概念,雖然我在前面有所提及,但是都是泛泛而談,也有各種語言融入進去,不理解的會越來越暈,那麼,這節我就專門來講講什麼是JAVA的面向物件。 面向過程和麵向物件回顧 不記得概念的可以具體看看之前的文章,這裡僅做簡單的回顧: 面向過程 關注於流
java 父類、子類 型別轉換【父類不能轉為子類】
java 父類不能轉為子類 package tao.test; class Base { public String str = "hello Base..."; public void hello(){ System.out.println(str); }
python內建物件型別轉換簡記
內建物件 釋義 int(x) 字串或數字轉換為整數,如果是浮點型數,則進行舍位,而不是舍入 long(x) 字串或整數轉換成長整形,同上 float(x)
Java虛擬機器工具之堆疊跟蹤工具jstack檢測物件wait方法
wait()方法源於Object類,當執行緒呼叫wait的時候,意思就是說執行緒會放棄物件鎖,進入等待此物件的等待鎖定池。 下面看看用jstack怎麼定位wait方法。 首先寫一段簡單的呼叫wait的程式碼: import java.util.conc
Java型別轉換之自動型別轉換和強制型別轉換區別理解總結
首先 , 晒出一段測試程式碼 /* * java中基本資料型別轉換的總結 (需要運算的值型別相同) */ // 宣告測試變數 int a; int b; long c; // 分割線 System.out.println("\n--------------
Java強制型別轉換,把浮點型轉為整型
public class Basic{ public static void main(String[] args){ double a = 10.0; double b = 3.0; System.out.println("a / b = "
Java中型別轉換問題整理...
Java中型別轉換是經常遇到的問題,這裡用來更新和總結型別轉換的方法和問題,以便日後回顧: Java裡基本資料型別有哪幾種?分別佔多大記憶體?在64位JVM裡呢? 思路:8大基本資料型別,佔位長固定與系統無關。 答:8種,按長度大小依次是: byte = 8 bit ; boo
【Java】Java強制型別轉換
/* * 強制型別轉換: * 如何將取值範圍小的轉換為取值型別大的 * * 將取值範圍小的轉換為取值型別大的會丟失精度。 * */ public class Data_Convert_Manual { public static
【Java】Java自動型別轉換
/* * 自動型別轉換,只要記住:取值範圍小的型別,自動轉換為取值範圍大的型別 * * 將一個範圍小的數轉換為範圍大的數,它不會丟失資料,如果將一個範圍大的數,轉換為範圍小的數,那麼他有可能會 * 丟失資料! * &
Java引用型別轉換
java的引用型別轉換分為兩種: 向上型別轉換,是小型別到大型別的轉換 向下型別轉換,是大型別到小型別的轉換 現存在一個Animal動物類,貓子類和狗子類繼承於Animal父類; 1 public class Animal { 2 private Stri
C#資料型別轉換之string到int型陣列
已知: string str = "1,2,3,4,5" 問: 如何根據上述字串產生一個int[]陣列?(int[] intLst = {1,2,3,4,5}) 答: 首先:string strLst = str.Split( ',' ) 然後:int[] int
三 進位制、精度,Java的型別轉換
進位制的表示: 0b010 : 二進位制表示形式:前面+0n 0100 : 八進位制表示形式: 前面+0 0x001 : 16進製表示形式:前面+0x 計算機以補碼的方式進行運算 進位制的轉換: 10進位制轉換成任意進位制: 除基倒取餘,結果從按餘數下往上寫
Java SE基礎部分--02.Java資料型別轉換、運算子、方法入門
學習目標: 1、資料型別轉換、 2、算數運算子、 3、賦值運算子、 4、比較運算子、 5、邏輯運算子、 6、三元運算子、 7、方法定義和呼叫 一、資料型別轉換: 1、資料型別轉換分為:隱式型別轉換、強制型別轉換。 隱式轉換:是將容量小的型別自動轉成容量大的
有關Java資料型別轉換
資料型別轉換 話不多說,先來圖片 基本資料型別與引用資料型別 基本:boolean, char,byte,short,int,long,float,double 引用:String,引用型別具體可分為:陣列、類和介面 隱式轉換 隱式轉換也叫作自動型別轉換
Java強制型別轉換
首先我們需要明確一下概念,明確一下什麼叫作強制型別轉換就是以強制的手段把一個數據型別的資料轉換成其他資料型別的資料。 舉個例子,假設我們有個整型資料9,我們要強制把它轉換成浮點型資料,我們知道,如果不考慮取值範圍的話,浮點型資料就是數學裡面的小數,大家覺得轉換以