最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java強制轉化示例代碼詳解

 更新時間:2025年03月25日 11:07:02   作者:不修×蝙蝠  
這篇文章主要介紹了Java編程語言中的類型轉換,包括基本類型之間的強制類型轉換和引用類型的強制類型轉換,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

引入

在Java編程語言中,類型轉換(無論是強制類型轉換還是自動類型轉換)的方向并不是簡單地基于“高位”和“低位”的概念,而是基于數(shù)據(jù)類型的范圍和精度。

基本類型強制轉換

1.數(shù)字之間

short s = 100;
int i = s; // 自動類型轉換,安全

int j = 30000; // 一個大于short類型能表示的最大值的int
short k = (short) j; // 強制類型轉換,可能導致數(shù)據(jù)丟失

上面給出了兩種數(shù)值轉換的概念,第一種是short轉成int類型,由于short是16位的,int是32位的,此時就是低精度轉為高精度,所以編譯器會自動進行類型轉換,是安全的,不用強轉(因為這種轉換是安全的,不會丟失任何信息,只是簡單地擴展了符號位)

而第二種則是讓int類型轉成short,高精度轉低精度,不安全,強制類型轉換,short只能存儲低16位的數(shù)據(jù),高16位的位置就舍棄了,所但凡int的高16位存有數(shù)據(jù),此時的強轉就會發(fā)生數(shù)據(jù)丟失。

所以通常而言,這種高精度強轉低精度是沒有意義的。

2.數(shù)字字符之間

引入

以前有涉及過steam,buffer的概念,并且它們本質都是數(shù)組。

int c=23456;
char d=(char) c; //將int類型的c強轉成char類型的d
System.out.println(d); //并且能夠解析輸出

steam就是類似如下的一串二進制數(shù)字,在解析時以8位或32位等解析成十進制,就可以得到不同的結果:

 int[] arr={23456,23457,34567,23876,32447};
 for(int x:arr){//解析輸出
      char e=(char) x;
      System.out.println(e);        
 }                             

【以上就是兩個基本類型強制轉換的例子,而且基本類型之間都可以進行強轉,只是有的沒有意義?!?/p>

引用類型的強制轉換

引入多態(tài)概念前提

e.g.首先,我們定義一個父類Animal,并在其中聲明一個方法makeSound,但不在父類中實現(xiàn)它(可以將它設為抽象方法,但在這個例子中,我們?yōu)榱撕喕屗祷匾粋€默認字符串)。然后,我們創(chuàng)建兩個子類DogCat,它們都繼承自Animal類,并各自實現(xiàn)了makeSound方法。

// 父類 Animal
class Animal {
    // 可以是一個抽象方法,但這里為了簡化,我們提供一個默認實現(xiàn)
    public String makeSound() {
        return "Some generic animal sound";
    }
}

// 子類 Dog 繼承自 Animal
class Dog extends Animal {
    @Override
    public String makeSound() {
        return "Woof! Woof!";
    }
}

// 子類 Cat 繼承自 Animal
class Cat extends Animal {
    @Override
    public String makeSound() {
        return "Meow! Meow!";
    }
}

public class PolymorphismExample {
    public static void main(String[] args) {
        // 使用父類類型的引用來指向子類對象
        Animal myDog = new Dog();
        Animal myCat = new Cat();

        // 調用被重寫的方法,將展示多態(tài)性
        System.out.println(myDog.makeSound()); // 輸出: Woof! Woof!
        System.out.println(myCat.makeSound()); // 輸出: Meow! Meow!

        // 盡管 myDog 和 myCat 都是 Animal 類型的引用,
        // 但它們實際上指向的是 Dog 和 Cat 對象,
        // 因此調用 makeSound 方法時會執(zhí)行子類中的實現(xiàn)。
    }
}

在這個例子中,展示了多態(tài)性的兩個關鍵方面:

父類引用指向子類對象myDog是一個Animal類型的引用,但它實際上指向了一個Dog對象。同樣,myCat是一個Animal類型的引用,但它指向了一個Cat對象。

方法重寫DogCat類都重寫了Animal類中的makeSound方法。因此,當通過myDogmyCat引用調用makeSound方法時,會分別調用DogCat類中的實現(xiàn)。

以上例子展示了多態(tài)所遵守的兩項,下面是完整的多態(tài)遵循條件:

要符合多態(tài),通常需要滿足以下幾個條件:

繼承:多態(tài)通常依賴于繼承關系。在面向對象編程中,子類繼承父類,從而可以重用父類的代碼并擴展新的功能。多態(tài)性允許我們使用父類類型的引用來引用子類對象。

方法重寫(Override):子類需要重寫父類中的某些方法,以便在調用這些方法時能夠表現(xiàn)出不同的行為。方法重寫是多態(tài)性的關鍵所在,它允許子類提供父類方法的具體實現(xiàn)。

父類引用指向子類對象:這是多態(tài)性的另一個重要方面。我們可以創(chuàng)建一個父類類型的引用,并將其指向一個子類對象。當通過這個引用調用一個被重寫的方法時,將調用子類中的該方法實現(xiàn),而不是父類中的實現(xiàn)。

接口或抽象類:雖然多態(tài)性不一定需要接口或抽象類,但它們?yōu)槎鄳B(tài)性提供了強大的支持。接口和抽象類可以定義方法簽名,而不提供具體實現(xiàn)。子類可以實現(xiàn)這些接口或繼承這些抽象類,并提供具體的方法實現(xiàn)。這樣,當使用接口或抽象類類型的引用來引用子類對象時,就可以實現(xiàn)多態(tài)性。

運行時類型識別(RTTI, Run-Time Type Identification):在Java等語言中,運行時類型識別是多態(tài)性的基礎之一。它允許程序在運行時確定對象的實際類型,并根據(jù)這個類型來調用相應的方法。這是通過方法重寫和父類引用指向子類對象來實現(xiàn)的。

【注意:雖然給出了這么多條件,但是多態(tài)性的核心在于方法重寫和父類引用指向子類對象(句柄可以指向自己類的對象或者自己的子孫后代類的對象)這兩個方面?!?/strong>

【注意:引用類型之間的強制類型轉換就沒有這么自由了,會有諸多限制】

如下兩個子類繼承Person父類:

【注意:遵循一個類的句柄可以指向自己類的對象或者自己的子孫后代類的對象】

所以以下兩種表達方式是錯誤的:

①直接報錯:

②運行時報錯:

運行時報錯是因為不符合多態(tài),即“指向自己類的對象或者自己的子孫后代類的對象”,這里表示的是:

將s(指向Child2實例的Person類型變量)強轉換成Child 3,Child2和Child3是兄弟關系,不符合多態(tài)。

 如何解決以下問題呢?(o ∀ o )

有啦??!就用那招!(??(??*)

引入關鍵字instanceof:

instanceof 是一個用于檢查對象是否為特定類或其任何父類的實例的關鍵字。這個操作符返回一個布爾值:如果對象是指定類的實例,或者是該類的任何子類的實例,則返回 true;否則返回 false

if (object instanceof ClassName) {
    // 對象是指定類的實例或其子類的實例時執(zhí)行的代碼
}

其中:

  • object 是要檢查的對象
  • ClassName 是要檢查的類名(包括接口名)

還不理解沒關系,以下給出一個實例:

class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}

public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();
        //Animal myDog = new Dog(); 創(chuàng)建了一個 Dog 類的實例,并將其引用賦值給 Animal 類型的變量 myDog。這意味著 myDog 指向的是一個 Dog 對象,但它在編譯時被視為 Animal 類型。
        Animal myCat = new Cat();
       // Animal myCat = new Cat(); 類似地,創(chuàng)建了一個 Cat 類的實例,并將其引用賦值給 Animal 類型的變量 myCat。
        System.out.println(myDog instanceof Dog);    // 輸出 true
        System.out.println(myDog instanceof Animal); // 輸出 true
        System.out.println(myDog instanceof Cat);    // 輸出 false
        System.out.println(myDog instanceof Object); // 輸出 true

        System.out.println(null instanceof Animal);  // 輸出 false
    }
}

在這個示例中,myDog 是 Dog 類的實例,也是 Animal 類和 Object 類的實例(因為所有類都繼承自 Object)。因此,myDog instanceof Dog 返回 true,myDog instanceof Animal 也返回 true,但 myDog instanceof Cat 返回 false,因為 myDog 不是 Cat 的實例。同樣地,null 不是任何類的實例,所以 null instanceof Animal 返回 false。

public class Test{
    public static void main(String[] mmm) throws Exception{
        Child2 x=new Child2();
        //Child2 x = new Child2(); 創(chuàng)建了一個 Child2 類的實例,并將其引用賦值給 Child2 類型的變量 x。
        Child3 w=new Child3();
        //Child3 w = new Child3(); 創(chuàng)建了一個 Child3 類的實例,并將其引用賦值給 Child3 類型的變量 w。

        //句柄可以指向自己類的對象或者自己的子孫后代類的對象
        Person s=x; //父類指子類child2
        m1(s);
        
        s=w;
        m1(s);
        
        public static void m1(Person s){
            Child3 w=null;
            if(s instanceof Child3){
            //?使用instanceof關鍵字檢查s是否是Child3的實例,如果是true,才進行下面的強轉代碼
               //?用instanceof來驗證強轉?
                 w=(Child3) s;            
            }
                   
        }                                                           
    }
}

可以看見上面對m1() 方法進行了兩次調用。

如果 s 指向的是 Child3 實例(在第二次調用 m1(s); 時),條件為真,代碼塊內的強轉類型轉換 w = (Child3) s; 會執(zhí)行。如果 s 指向的是 Child2 實例(在第一次調用 m1(s); 時),條件為假,代碼塊內的代碼不會執(zhí)行。

總結

到此這篇關于Java強制轉化的文章就介紹到這了,更多相關Java強制轉化內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • spring-boot中使用spring-boot-devtools的實現(xiàn)代碼

    spring-boot中使用spring-boot-devtools的實現(xiàn)代碼

    這篇文章主要介紹了spring-boot中使用spring-boot-devtools的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • 基于java實現(xiàn)顏色拾色器并打包成exe

    基于java實現(xiàn)顏色拾色器并打包成exe

    這篇文章主要為大家詳細介紹了如何基于java編寫一個簡單的顏色拾色器并打包成exe文件,文中的示例代碼講解詳細,需要的小伙伴可以跟隨小編一起學習一下
    2023-10-10
  • SpringBoot 分布式驗證碼登錄方案示例詳解

    SpringBoot 分布式驗證碼登錄方案示例詳解

    為了防止驗證系統(tǒng)被暴力破解,很多系統(tǒng)都增加了驗證碼效驗,比較常見的就是圖片二維碼,業(yè)內比較安全的是短信驗證碼,當然還有一些拼圖驗證碼,加入人工智能的二維碼等等,我們今天的主題就是前后端分離的圖片二維碼登錄方案,感興趣的朋友一起看看吧
    2023-10-10
  • jquery uploadify和apache Fileupload實現(xiàn)異步上傳文件示例

    jquery uploadify和apache Fileupload實現(xiàn)異步上傳文件示例

    這篇文章主要介紹了jquery uploadify和apache Fileupload實現(xiàn)異步上傳文件示例,需要的朋友可以參考下
    2014-05-05
  • Java Spring 中的監(jiān)聽器Listener詳解與實戰(zhàn)教程

    Java Spring 中的監(jiān)聽器Listener詳解與實戰(zhàn)教程

    Spring 提供了多種監(jiān)聽器機制,可以用于監(jiān)聽應用生命周期、會話生命周期和請求處理過程中的事件,這篇文章主要介紹了Java Spring 之監(jiān)聽器(Listener)詳解與實戰(zhàn),需要的朋友可以參考下
    2025-06-06
  • SpringBoot整合redis使用緩存注解詳解

    SpringBoot整合redis使用緩存注解詳解

    這篇文章主要介紹了SpringBoot整合redis使用緩存注解詳解,@Cacheable在方法執(zhí)行前判斷對應緩存是否存在,如果存在直接返回緩存結果,否者執(zhí)行方法將結果緩存,適用于查詢類,需要的朋友可以參考下
    2024-01-01
  • Spring Boot啟動過程全面解析(三)

    Spring Boot啟動過程全面解析(三)

    這篇文章主要介紹了Spring Boot啟動過程全面解析(三)的相關資料,需要的朋友可以參考下
    2017-04-04
  • Spring MVC請求參數(shù)的深入解析

    Spring MVC請求參數(shù)的深入解析

    這篇文章主要給大家介紹了關于Spring MVC請求參數(shù)解析的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • Java的最大棧深度與JVM核心知識介紹

    Java的最大棧深度與JVM核心知識介紹

    這篇文章主要有兩個部分,一部分介紹JAVA的最大棧深度,第二部分介紹了JVM核心知識,需要的朋友可以參考下面文章的具體內容
    2021-09-09
  • 使用jmeter實現(xiàn)對jar包的調用方式

    使用jmeter實現(xiàn)對jar包的調用方式

    這篇文章主要介紹了使用jmeter實現(xiàn)對jar包的調用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03

最新評論

营口市| 黎平县| 景德镇市| 双江| 县级市| 韶山市| 冕宁县| 汉阴县| 博野县| 河津市| 杂多县| 通道| 汉阴县| 黄梅县| 化德县| 富宁县| 米脂县| 孝义市| 景德镇市| 新营市| 塔河县| 兴山县| 台州市| 营山县| 抚宁县| 浮梁县| 紫金县| 洛浦县| 武夷山市| 灌阳县| 西宁市| 孟村| 孙吴县| 马山县| 平昌县| 新邵县| 开原市| 安西县| 昌宁县| 西林县| 江都市|