object cast 為什麼Java的+ =, - =,* =,/ =複合賦值運算符需要轉換?




5 Answers

這個演員的一個很好的例子是使用* =或/ =

byte b = 10;
b *= 5.7;
System.out.println(b); // prints 57

要么

byte b = 100;
b /= 2.5;
System.out.println(b); // prints 40

要么

char ch = '0';
ch *= 1.1;
System.out.println(ch); // prints '4'

要么

char ch = 'A';
ch *= 1.5;
System.out.println(ch); // prints 'a'
java class cast

直到今天,我還以為:

i += j;

只是一個捷徑:

i = i + j;

但是,如果我們嘗試這個:

int i = 5;
long j = 8;

那麼i = i + j; 不會編譯,但i += j; 將編譯好。

這是否意味著事實上i += j; 像這樣的東西的快捷方式i = (type of i) (i + j)




是,

基本上我們寫的時候

i += l; 

編譯器將其轉換為

i = (int)(i + l);

我剛檢查了.class文件代碼。

真的是一件好事




這裡的問題涉及類型鑄造。

當你添加int和long時,

  1. int對像被轉換為long並且兩者都被添加並且你得到長對象。
  2. 但是長對像不能隱式地轉換為int。 所以,你必須明確地這樣做。

但是+=以這樣的方式編碼,即它進行類型轉換。 i=(int)(i+m)




有時,在面試時可以提出這樣的問題。

例如,當你寫:

int a = 2;
long b = 3;
a = a + b;

沒有自動類型轉換。 在C ++中,編譯上面的代碼不會有任何錯誤,但在Java中,您將獲得類似Incompatible type exception

所以要避免它,你必須編寫如下代碼:

int a = 2;
long b = 3;
a += b;// No compilation error or any exception due to the auto typecasting



這裡的細微之處......

j是double並且i是int時, i+j有一個隱式的類型轉換。 Java ALWAYS在它們之間有操作時將整數轉換為double。

為了澄清i+=j ,其中i是整數, j是double,可以描述為

i = <int>(<double>i + j)

請參閱: 隱式轉換的此描述

在這種情況下,為了清楚起見,您可能希望將j轉換為(int)




Related