Ber*_*ard 7 java object wrapper primitive-types
这两条线有什么区别?
int pInt = 500;
Run Code Online (Sandbox Code Playgroud)
和
Integer wInt = new Integer(pInt);
Run Code Online (Sandbox Code Playgroud)
要么
Integer wInt = new Integer(500);
Run Code Online (Sandbox Code Playgroud)
Den*_*ret 17
没有.
这是完全相同的事情.在第一种情况下,您只有一个补充变量.
请注意,使用自动装箱您很少需要同时拥有变量int
和Integer
变量.所以对于大多数情况来说这就足够了:
int pInt = 500;
Run Code Online (Sandbox Code Playgroud)
整数有用的主要情况是区分变量未知的情况(即null
):
Integer i = null; // possible
int i = null; // not possible because only Object variables can be null
Run Code Online (Sandbox Code Playgroud)
但是不要保留两个变量,一个就足够了.
对于初学者
int pInt = 500;
,这里pInt
不是一个对象而是在
Integer wInt = new Integer(500);
wInt
是一个参考
这也是java不是纯面向对象语言的原因.因为一切都不是java的对象.
在Java中,primitve类的实例保存实例的实际值,但包装类的实例保存对该对象的引用.即找到对象的地方的地址.
当您使用此行编写程序时:
Integer integer = 500;
Run Code Online (Sandbox Code Playgroud)
编译器将其更改为:
Integer integer = new Integer(500);
Run Code Online (Sandbox Code Playgroud)
此过程称为自动装箱.这是自动将原始实例放在Integer的"框"中.因此,输出以下程序:
public class PrimitiveToObject {
public static void main(String[] args) {
printClassName(1);
printClassName(1L);
printClassName((char)1);
}
public static void printClassName(Object object){
System.out.println(object.getClass());
}
}
Run Code Online (Sandbox Code Playgroud)
这是:
class java.lang.Integer
class java.lang.Long
class java.lang.Character
Run Code Online (Sandbox Code Playgroud)
这个:
int i = integer;
Run Code Online (Sandbox Code Playgroud)
变成这个:
int i = integer.intValue();
Run Code Online (Sandbox Code Playgroud)
这称为拆箱.
如上所示,点运算符(.
)用于名为integer
但未打开的变量i
.也就是说:包装器的对象可以被解除引用,但不能是原始实例.
拳击和拆箱可能会减慢程序的速度.因此,对于一个新手来说,包装可能看起来像增加了负担,但事实并非如此.包装器用于对象需要作为引用类型的位置.例如:Map<Integer,String>map=new HashMap<Integer,String>();
是有效的声明,但Map<int,String>map=new HashMap<int,String>();
不是有效的声明.
包装器非常有用的另一种典型情况:
在MySQL中,NULL
是INT
类型列的有效条目.但是在Java中,int
不能null
有价值,Integer
可以.这是因为在SQL中NULL
符号表示不可用.因此,如果您使用JDBC在MySQL表中插入整数值,则null
java程序中的a将有助于插入NULL
MySQL表.
包装类在与此类似或相似的情况下也可能有用:
Boolean decision; // Using wrapper for boolean.
if("YES".equalsIgnoreCase(consent))
decision = Boolean.TRUE; // In favour
else if("NO".equalsIgnoreCase(consent))
decision = Boolean.FALSE; // Not in favour
else if("CAN'T SAY".equalsIgnoreCase(consent))
decision = null; // Undecided
Run Code Online (Sandbox Code Playgroud)