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ę:)

Author: Naruto Biju Mode, 2014-03-26

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 .

 12
Author: arshajii,
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..

 0
Author: Sanu Vithanage,
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

 0
Author: Mark Burleigh,
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