为什么在java中有每个基本类型的包装器

时间:2012-01-18 19:24:38

标签: java primitive-types

Number子类包装原始数字类型(ByteIntegerDoubleFloatLong和{{1} })。

他们的目的是什么?

12 个答案:

答案 0 :(得分:17)

创建了这些包装类,以便有一些方法可以将这些基本类型与ArrayList等各种容器类一起使用。由于原始类型不能直接强制转换为Object引用,因此它们存储在包装类中,以允许在需要Object引用的地方使用它们。

答案 1 :(得分:11)

因为包装是Objects

  • Collections需要对象
  • 对象可以instantiated为null
  • 如果您在原语中实例化为-1,我们可以获得NullPointerException而不是奇怪的行为
  • “包装器”具有方便方法

答案 2 :(得分:5)

许多早期的面向对象语言(Smalltalk等)对所有值都有一个共同的"top type",这样可以更容易地定义与它们穿梭的值类型无关的泛型操作。

  

类型理论中的顶级类型,通常缩写为顶部或由向下标记符号(⊤),是通用类型 - 该类型包含所关注类型系统中的每个可能对象。

Java没有这样的顶级类型,但Object是最接近的类型。从原始值到Object的实例的映射允许它有效地用作顶部类型。

核心语言工具java.lang.reflect使用Object作为顶级类型的替身 - 当您反思性地调用传入Object的方法并获取{{1 }}

答案 3 :(得分:2)

根据此链接java tutorial原因是:

有三个原因可以使用Number对象而不是基元:

  
      
  • 作为期望对象的方法的参数(通常在操作数字集合时使用)。
  •   
  • 使用类定义的常量,例如MIN_VALUE和MAX_VALUE,它们提供数据类型的上限和下限。
  •   
  • 使用类方法将值转换为其他基本类型,从而转换为字符串和从字符串转换,以及在数字系统之间进行转换(十进制,八进制,十六进制,二进制)。
  •   

答案 4 :(得分:2)

Java设计师 - 出于好的理由或不好 - 选择不在Object上建立所有类型。 像intlongchar等原始类型不是基于Object,因此它们具有相当不同的语义,就像它们通过值传递而不是而不是参考。

Integer / Long基本上只是包装类,使原始类型的行为与任何其他类型一样,以便能够在类或对象更适合的上下文中使用它们。

例如,由于语义不同,集合必须有两个版本,一个用于Object,另一个用于基本类型。只需制作单个版本的集合并包装原始类型就更容易了。

答案 5 :(得分:1)

Java API中的包装类基本上有两个主要目的:

  • 让原语包含在为对象保留的活动中,例如添加到Collections,或从具有对象返回值的方法返回。
  • 为基元提供各种实用程序功能。这些函数中的大多数与各种转换有关:将原语转换为String对象,以及将原语和String对象转换为不同的基数(或基数),如二进制,八进制和十六进制。

答案 6 :(得分:0)

将它们视为对象并将它们放入List,Maps等

答案 7 :(得分:0)

因此,我们能够将原始数据类型添加到集合中。要将元素添加到集合中,它们必须是objects类型。因此,引入了包装类,让我们创建primitive data types

的对象

例如:

Arraylist :   add(Object o) 

TreeSet:      add(Object o) 

答案 8 :(得分:0)

就个人而言,我使用它们作为方法的参数,所以我不必担心传入的数字的类型。然后我可以使用像doubleValue()这样的方法来获取值并且可以继续而不用担心传递了什么。

这是拥有抽象基类的基本原因。

答案 9 :(得分:0)

有一种特定类型的“指针”可以指向任何类型(如C / C ++中的void)。

我指的是java.lang.Object

E.g。你可以这样做:

List<String> aList = new ArrayList<String>();  
Object o = aList;

BUT 这不适用于基元,即基元没有void引用类型。即原始类型无法引用任何类型的原始类型。

因此,如果您想要一个对任意变量进行操作的算法,您可以使用java.lang.Object类型的变量 如果任意值是基元,请使用适当的Object Wrapper来包装它们并使用java.lang.Object引用来操作它们。

您也可以在Collections中看到这一点

答案 10 :(得分:0)

包装类是原始数据类型的对象代表,因此只要有将它们用作对象的情况,我们就必须使用它们。 当需要效率时我们需要对象和原语时的包装器使用。

答案 11 :(得分:0)

1st - 为了使java完全面向对象。

2nd - 我们不能通过对方法的引用传递基本类型,并且java实现的许多标准数据结构对对象进行操作:例如(ArrayList,HashSet,HashMap等) ,所以他们需要这些对象参考