簡體   English   中英

將 char 傳遞給帶有 int 參數的方法

[英]Passing char into a method with an int parameter

以下代碼的輸出是123因為substring從 beginIndex 到 EndIndex - 1。但是,我很驚訝這里的char被理解為 3 (int),因為substring需要兩個 int。 這背后的概念是什么?

String x = "12345";
char a = 3;
x = x.substring(0, a);
System.out.println(x);

這一路回到C ,其中char本質上是一個窄整數類型,並在必要時隱式轉換為int

在 Java 中,這在技術上稱為“擴展原語轉換”, 在 JLS 的第 5.1.2 節中進行了介紹

其他人已經解釋了它為什么起作用,但請注意,將 char 變量用於索引是不好的做法,因為它們具有不同的關聯語義,因此將 char 用作索引會令人困惑。

僅使用 char 來存儲字符數據,可能更好:盡量避免使用 char,因為它們甚至不足以存儲每個字符(請參閱 Unicode 和代碼點討論)。 使用 int 來存儲字符代碼點。

這是隱式和顯式轉換的概念。 char 是小數據類型,然后是整數,因此當將字符作為值傳遞時,它會自動將 char 值轉換為 int 值。

public static void age (int  num){
        System.out.println(num);
   }
           char character = '2';
            age(character); output is 50.

字符形式 '0' 到 '9' 打印值 48 到 57

所以 substring 的函數聲明看起來像 substring(int startIndex, int endIndex)。 現在,當您傳遞 char 時,它會自動提升為整數 (endIndex),因此被視為 int。

看看第5.1.2節,它討論了擴大轉換。

這稱為隱式轉換。 如果將 int 值分配給 double 也會發生同樣的情況。 快速示例

    double d = 1;

1 是一個int但它被隱式轉換為double (1.0)。

char a = 3; ,您可以將其視為存儲0011 ,即 3 的二進制值。實際上並未存儲字符“3”:如果您嘗試處理的是字符,則不會得到3 但如果你這樣做了

char a = '3';

現在您要存儲 char 3,ascii 值為 51,如果您嘗試像在 int 中一樣使用它,您將得到 51。

從技術上講,這是因為charint的子類型。

為了確定substring(int,int)是否適用於參數(int,char) ,我們首先嘗試15.12.2.2 階段 1:識別適用於 Subtyping 的匹配 Arity 方法,我們需要測試char是否是int的子類型。 根據 4.10.1 原始類型之間的子類型,它是。

然后,為了將char參數分配給int參數,根據15.12.4.5 Create Frame, Synchronize, Transfer Control ,我們應用5.3 Method Invocation Conversion ,將char轉換為int ,根據5.1.2 Widening Primitive Conversion

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM