Jak działa Java auto boxing/unboxing?
Ponieważ JDK 5.0, auto boxing/unboxing został wprowadzony w Javie, sztuczka jest prosta i pomocna, ale kiedy zacząłem testować różne konwersje między klasami owijania i prymitywnymi typami, naprawdę się mylę, jak działa pojęcie auto boxingu w Javie, na przykład:]}
Boks
int intValue = 0;
Integer intObject = intValue;
byte byteValue = 0;
intObject = byteValue; // ==> Error
Po wypróbowaniu różnych spraw (short
, long
, float
, double
), jedynym przypadkiem, który jest akceptowany przez kompilator jest wtedy, gdy typ wartości po prawej stronie afektacji operatorem jest int
.
Kiedy zajrzałem do źródła Integer.class
odkryłem, że implementuje on tylko jeden konstruktor z parametrem int
.
Więc mój wniosek jest taki, że koncepcja boksu samochodowego opiera się na konstruktorze zaimplementowanym w klasie wrapper. Chcę wiedzieć, czy ten wniosek jest prawdziwy, czy istnieje inne pojęcie używane przez auto boxing?
Unboxing
Integer intObject = new Integer(0);
byte byteValue = intObject; // ==> Error (the same Error with short)
int intValue = intObject;
double doubleValue = intObject;
Mój wniosek na temat unboxingu jest taki, że Klasa wrapper daje wartość owiniętą przez obiekt w odpowiedni typ (Integer
==> int
), Następnie kompilator używa zwykłych reguł konwersji prymitywnych typów (byte
=> short
=> int
=> long
=> float
=> double
).
Chcę wiedzieć, czy ten wniosek jest prawdą, czy istnieje inna koncepcja używana przez auto unboxing?
Dzięki za zaliczkę:)
3 answers
W razie wątpliwości sprawdź bajt:
Integer n = 42;
Staje się:
0: bipush 42
2: invokestatic #16 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: astore_1
Więc w rzeczywistości, valueOf()
jest używany w przeciwieństwie do konstruktora (i to samo dotyczy innych klas wrappera). Jest to korzystne, ponieważ pozwala na buforowanie i nie wymusza tworzenia nowego obiektu przy każdej operacji bokserskiej.
Odwrotność jest następująca:
int n = Integer.valueOf(42);
Który staje się:
0: bipush 42
2: invokestatic #16 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: invokevirtual #22 // Method java/lang/Integer.intValue:()I
8: istore_1
I. e. intValue()
jest używany (znowu jest analogiczny do innych typy owijarek również). To jest naprawdę wszystko auto (nie)Boks sprowadza się do.
O konwersji boksu i unboxingu można przeczytać odpowiednio wJLS §5.1.7 iJLS §5.1.8 .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-25 23:53:32
Auto boks i auto unboxing
Auto Boks oznacza, że kiedy próbujemy przypisać prymitywne dane do typu obiektu, automatycznie konwertuje się na typ obiektu.ten proces nazywa auto Boks.. a gdy typ obiektu przekształca się w typ prymitywny, nazywa się go unboxing...spróbuj to zrozumieć na poniższych przykładach.
class Demo{
public static void main(String args[]){
int x=100;
//Integer iob=x; //Illegal jdk1.4
Integer iob=Integer.valueOf(x); //Legal at JDK1.4 =>Boxing
Integer iob2=x; //Legal JDK1.5 - Autoboxing
System.out.println(iob2);
}
}
Kolejny przykład boksu samochodowego
class Demo{
public static void main(String args[]){
Integer iob=new Integer(100);
int x;
x=iob; //Legal => auto unboxing
System.out.println(x);
}
}
Przykład automatycznego rozpakowywania
class Demo{
public static void main(String args[]){
Integer iob=new Integer(100);
int x=iob; //Auto unboxing ==>Assignment
}
}
Dziękuję ty..
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-29 16:13:26
Rozważmy następujący kod jako przykład auto un-boxingu:
System.out.println('b'+ new Integer(63));
Oto podział jak powyższy kod jest kompilowany:
Krok 1: obiekt Integer 63 jest tworzony i automatycznie UNBOXED do int 63
new Integer(63)
Krok 2: Znak 'b' jest konwertowany na wartość liczbową tj.]}
Krok 3: dodano dwie wartości: 98+63
Krok 4: wyjście to 161
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-16 12:54:51