由java的繼承和向上轉型,子類能夠很天然地轉換爲父類對象,即父類類型能夠直接引用子類對象,可是子類類型不能直接引用父類對象,須要進行強制轉換。子類比父類擁有更多的屬性和更強的功能,這個時候咱們使用功能較弱的類型(父類)引用功能較強的對象(子類),這是可行的。可是將功能較弱的類型(父類)強制轉功能較強的對象(子類)時,就不必定能夠行了。java
向上轉型,子類對象將引用賦予父類類型, java容許一個對象能夠不被其對應的類型所引用,而被其父類類型引用,從而可使用其父類類型,父類引用沒法調用子類對象中父類沒有的方法,向上轉型會有子類特性丟失。如:father.fat(),father中只能調用fat()方法,而沒法調用so()方法。若須要使用其原對象特性,這時就須要向下轉型了,用一個它自己類型的變量來引用它。code
向下轉型是能夠成功的,如:(Son)father,①中的向下轉型失敗是由於father自己的對象是Father,強制轉換會使做用域溢出(ClassCastException:當前者的域小於後者的時候出現),而②中father自己就是Son對象,(Son)father只是讓其恢復自己特性,因此是能夠成功的。可是說到底父類對象仍是沒法轉換爲子類所引用。父類引用能夠指向子類對象,可是子類引用卻不能指向父類對象。對象
當咱們用一個類型的構造器構造出一個對象時,這個對象的類型就已經肯定的,也就說它的本質是不會再發生變化了。如:father被賦予的是Son類的對象,因此father調用的fat()方法是Son對象中的fat()方法,Son對象即便被賦予給了father類型,但其自己仍是Son對象,調用的方法仍是原對象中的方法。繼承
public class Father { public void fat(){ System.out.println("I`m father"); } } public class Son extends Father { public void fat(){ System.out.println("I`m a father of my son"); } public void so() { System.out.println("I`m son"); } } public class TypeStrong { public static void main(String[] args) { Son son = new Son(); Father father = son;//向上轉型,父類引用指向了子類對象,此時子類對象的類型爲父類引用的類型 father.fat();//只能調用fat()方法,沒法調用so()方法,且fat()輸出爲:I`m a father of my son father = (Son) father;//依然沒法調用so()方法,由於father爲Father類型 ((Son) father) .so();//終於能夠調用了... // Father father2 = new Father(); // Son son2 = (Son) father2;//①運行出錯,ClassCastException,父類對象不能爲子類的類型引用 Son son2 = (Son) father;//②運行成功,向下轉型,將本來父類引用賦予到子類引用上,固然此時仍是子類對象爲子類的類型引用 } }
將一種類型的數據賦給另一種類型變量時,知足下列兩種要求將執行自動類型轉換:1.兩種類型是兼容的 ;2.目的類型的範圍比來源類型大 。作用域
數值類基本數據類型按照範圍大小可分爲:byte,short,char,int,long,float,doubleio
數值類數據類型和字符類數據類型、布爾類數據類型不兼容,字符類數據類型和布爾類數據類型互相也不兼容。ast
注意:class
- byte、short、char類型進行 + 操做,最後得出的結果爲int數據類型
- 字符類數據類型與數值類數據類型進行 + 操做,最後得出的結果爲字符類數據類型