包装类声明

时间:2013-10-22 06:35:43

标签: java string wrapper

这个问题继续问题How can a string be initialized using " "?

我想提醒您注意,即使IntegerDoubleCharacterFloatBoolean包装类也可以在同一个声明中声明方式String被声明为:

String s = "Test string"

Integer i = 10; //valid
Double d = 10.00; //valid
Boolean b = true; //valid

这些课程是否也像String课程一样受到特殊待遇。

5 个答案:

答案 0 :(得分:3)

正如我在上一篇回答中指出的那样(How can a string be initialized using " "?

是的,要将primitive类型保留在OOP中,设计师会在primitivesObject's之间与Wrappers建立桥梁,他们会有特殊待遇。

原因显然是explained in docs

  

然而,有理由使用对象代替基元,Java平台为每种基本数据类型提供包装类。这些类将对象“包装”在对象中。通常,包装由编译器完成 - 如果您使用需要对象的原语,则编译器会为其包装原型。类似地,如果在期望基元时使用数字对象,则编译器会为您取消对象的对象。有关详细信息,请参阅Autoboxing and Unboxing

我们在程序中广泛使用primitives因此,允许使用

等语法可能是一个设计决定
   Integer i = 10; //primitive style

然后memorycompile时间为 i 分配,因为它是primitive类型,当他们找到Wrapper类型声明时Assignment operator =

语法明智,这更方便和快乐(至少对我而言:))。

比写作,

   Integer i = new Integer(10); //Object creation style

答案 1 :(得分:2)

以下所有陈述:

Integer i = 10; //valid
Double d = 10.00; //valid
Boolean b = true; //valid
由于autoboxing

有效

  

Autoboxing是Java编译器自动转换   原始类型与其对应的对象包装器之间   类

答案 2 :(得分:1)

是原始的包装类也表现得像String类。

您可以在下面进行说明

Integer i1 = new Integer(10); //valid
Integer i2 =10;
System.out.println(i1==i2); // this one is false
i1=10;  
System.out.println(i1==i2); //// this one is true

答案 3 :(得分:0)

所有原始类型的包装类都以这种方式运行。它被称为 autoboxing ,并在java 1.5中引入:

http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

答案 4 :(得分:0)

String str = "Test String";  有特殊待遇与Integer i = 10;无关 什么是特殊待遇String s = "Test String";? 这些被称为字符串文字获取jvm的String常量池中的内存。 一个特殊的意义是垃圾收集,汇集的常数是 永远不会受到垃圾收集的影响。 将'str'设为null不会使“Test String”符合垃圾回收的条件。 为什么?:: JVM将来会尝试重用这个“测试字符串”。垃圾收集算法排除池内存中的对象。所以正常的GC规则不适用于此处。看看这个:why String literals are not garbage collected

现在这种处理方式与包装纸的自动装箱完全不同。自动装箱是从JDK1.5引入的。 auto boxing & auto unboxingInteger i = 10;编译器将此语句替换为Integer i = Integer.valueOf(10);时 只有JVM的内部缓存包装器对象的行为类似于剩余的字符串文字。现在什么是内部缓存包装器对象?

Integer i = 100;
Integer j = 100;

引用i& j给出一个预先存在的对象的地址。 这就是if( i==j) //true

的原因
Integer k = 130; 
if( i==k) // false

因为k的值超出了整数的-128 to 127缓存范围。 检查一下:Integer wrapper behaviour when value range is -128 to 127 在上面,如果我们使引用k无效,那么它的对象将经历GC,这与字符串文字不同。 如果我们使i或j无效,那么相应的缓存对象永远不会 受GC影响,这与字符串文字相同。