java學習筆記 —— 自動轉換與強制轉換

一、引用數據類型轉換:

由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

  1. byte、short、char類型進行 + 操做,最後得出的結果爲int數據類型
  2. 字符類數據類型與數值類數據類型進行 + 操做,最後得出的結果爲字符類數據類型
相關文章
相關標籤/搜索