原始类型和引用类型有什么区别?

81

这是一道过去的考试题,我想首先问一下什么是原始类型和引用类型? 对于数组,我知道引用类型是由对象或变量组成的数组,而原始类型则是只使用int或string来创建数组。(是吗?)

你认为你在考试中如何回答这个问题并获得好的分数?不直接提及原始数组类型,有没有办法回答这个问题?还是你认为只用数组解释也可以?


3
"primitive type" 指的是你可以只用 int 或 string 来创建数组的类型。在 Java 中,String(字符串)并不属于原始类型,更加准确地说应该是 Strings。 - amit
3
每当有人问这种问题时,我建议他们先学习 C 语言。 - taskinoor
3
在C语言中,按引用传递参数是有明确定义的。理解指针、值和按引用传递等概念几乎可以确保理解引用和原始类型之间的区别,尽管在C语言中没有引用的概念。通过与内存和底层交互来“搞”,可以更好地理解什么是引用,什么是值。 - amit
1
@Eng.Fouad,是的,但底层概念非常相似。我从未见过一个理解C指针但不理解Java/C++引用的人。 - taskinoor
2
几十年前,原始类型的普遍接受定义仅仅是适合于微处理器寄存器的变量类型。通常是A、AX、EAX等累加器。例如,字符串是数组,无法适应寄存器。整数始终是累加器的大小(位宽)。引用可能不是指针,但指针就是引用。 - jinzai
显示剩余3条评论
9个回答

179

来自书籍OCA JAVA SE 7

正如约翰·格雷(John Gray)所说,男人和女人在根本上是不同的,原始变量和对象引用变量也有多种不同之处。基本区别在于,原始变量存储实际值,而引用变量存储它们所引用的对象的地址。假设类Person已经定义好了。如果您创建一个int变量a和一个对象引用变量person,它们将按图2.13所示存储其值。

int a = 77;
Person person = new Person();

输入图像描述


3
他们应该将最佳答案的标记时间增加到24小时,然后弹出提醒以提醒您标记答案,以便人们不会急于进行标记。我也可以说参考类型可以存储原始数据,但我知道还有更多内容。谢谢。 - Все Едно
讲解得很好。不过我这里还有一个问题。非原始变量和引用变量之间有什么区别吗(还是它们只是同义词)? - atish
1
据我所知,它们只是同义词。 - O.Badr
2
@QuackMan245 这必须被选为答案!投票支持,非常感谢。 - user5871859
@ВсеЕдно 目前仍不清楚为什么要使用引用类型?例如,可以使用 Person person = new Person();,也可以使用 Person person; person.set(something); person.get() - user2979872

47

以下是Java中的基本数据类型:

  • boolean(布尔型)
  • byte(字节型)
  • short(短整型)
  • char(字符型)
  • int(整型)
  • long(长整型)
  • float(单精度浮点型)
  • double(双精度浮点型)

其他所有类型都是引用类型:它们引用对象。

这是有关该语言基础的Java教程的第一部分


7
尽管这个答案是正确的,但我怀疑他不会得到完全的认可。我认为讲师希望听到更多关于“引用对象”的含义,以及一些示例展示在调用方法中更改变量时,变量在呼叫环境中发生了什么。 - amit
5
好的,但我不会重复教程中的所有内容,我更喜欢给他指向可以学习的页面,而不是一个现成的答案。 - JB Nizet
请注意,所有的数组类型都是对象,并且可以转换为/从java.lang.Object进行强制转换。 - Nayuki
7
我认为这并没有回答问题。你没有真正说明原始类型和引用类型之间的区别,而只是列出了其中一些。JB,我觉得你浪费了写一个通常情况下非常好的答案的机会。 - Dawood ibn Kareem
1
我认为应该接受BERGUIGA Mohamed Amine所给出的答案。 - Yogesh D
6
这并非回答“What's the difference”的问题。 - Dmitriy Pavlukhin

8

基本数据类型:

  • 由语言预定义并以关键字命名
  • 总数=8
    boolean(布尔型)
    char(字符型)
    byte(字节型)
    short(短整型)
    integer(整形)
    long(长整型)
    float(单精度浮点型)
    double(双精度浮点型)

引用/对象数据类型:

  • 使用类的定义构造函数创建
  • 用于访问对象
  • 任何引用变量的默认值为null
  • 引用变量可用于引用声明类型或任何兼容类型的任何对象。

6

原始类型和引用类型:

首先:

原始类型是基本的数据类型: byte, short, int, long, float, double, boolean, char。 原始变量存储原始值。 引用类型是任何可实例化的类以及数组: String, Scanner, Random, Die, int[], String[]等。 引用变量存储内存中数据存储位置的地址。

其次:

原始类型存储值,但引用类型存储堆空间中对象的句柄。请记住,引用变量不像您可能在C和C ++中看到的指针,它们只是对象的句柄,以便您可以访问它们并对对象状态进行更改。

阅读更多:http://javarevisited.blogspot.com/2015/09/difference-between-primitive-and-reference-variable-java.html#ixzz3xVBhi2cr


4

这些是原始数据类型

  • 布尔型
  • 字符型
  • 字节型
  • 短整型
  • 整型
  • 长整型
  • 单精度浮点型
  • 双精度浮点型

这些数据类型保存在内存中的栈中,而栈是由管理内存的系统来管理的。相反,对象数据类型或引用数据类型存储在内存的堆中,由垃圾回收器(GC)来管理。

这是最重要的区别。


不是。原始值可以存储在堆栈或堆中。如果它是某个对象的字段,则将其存储在堆中。 - Dawood ibn Kareem

3

很多人已经正确或不太正确地解释了引用类型和基本类型,可能有人对于Java中更相关的类型感兴趣。以下是我所知道的Java类型的完整列表(至少包括JDK 11)。

基本类型

描述一个值(而不是一种类型)。

11

引用类型

描述扩展Object的具体类型(接口、类、枚举、数组)。此外,TypeParameter实际上也是一个引用类型!

Integer

注意:原始类型和引用类型之间的区别需要依靠装箱来将原始类型转换为对象实例,反之亦然。
注意2:类型参数描述具有可选下限或上限的类型,并且可以在其上下文内按名称引用(与通配符类型相对)。类型参数通常可以应用于参数化类型(类/接口)和方法。参数类型定义了一个类型标识符。
通配符类型:
通过使用super或extend表达未知类型(类似于TypeScript中的any),可以具有较低或较高的限制。
? extends List<String>
? super ArrayList<String>

Void类型

空无。不可能有任何值或实例。

void method();

空类型

唯一的表示是 'null'。它在类型推断计算中特别使用。空值是任何类型逻辑上属于的一个特殊情况(可以分配给任何类型的变量),但实际上不被认为是任何类型的实例(例如:(null instanceof Object) == false)。

null

联合类型

联合类型是一种包含多个备选类型的类型。遗憾的是,在Java中,它只存在于多异常捕获语句中。

catch(IllegalStateException | IOException e) {}

干涉类型

一种兼容多种类型的类型。由于Java中一个类最多只有一个超类(Object没有超类),因此干涉类型只允许第一个类型是类,而其他每个类型都必须是接口类型。

void method(List<? extends List<?> & Comparable> comparableList) {}

未知类型

该类型未知。这种情况适用于某些Lambda定义(不包含在括号中,单个参数)。

list.forEach(element -> System.out.println(element.toString)); //element is of unknown type

变量类型

'var'关键字用于声明变量时引入的未知类型。

var variable = list.get(0);

3

基本数据类型

基本数据类型是编程语言提供的基础类型,作为程序的基本构建块,因此是预定义的数据类型。基本类型始终具有值,它存储简单的值。

它指定变量值的大小和类型,因此基本类型的大小取决于数据类型,并且没有其他方法。

这些是该语言中保留的关键字。因此,我们不能将这些名称用作变量、类或方法名称。基本类型以小写字母开头。在声明基本类型时,我们不需要分配内存(Java中内存由JRE-Java Runtime Environment分配和释放)。

Java中的8种基本数据类型

+================+=========+===================================================================================+
| Primitive type | Size    | Description                                                                       |
+================+=========+===================================================================================+
| byte           | 1 byte  | Stores whole numbers from -128 to 127                                             |
+----------------+---------+-----------------------------------------------------------------------------------+
| short          | 2 bytes | Stores whole numbers from -32,768 to 32,767                                       |
+----------------+---------+-----------------------------------------------------------------------------------+
| int            | 4 bytes | Stores whole numbers from -2,147,483,648 to 2,147,483,647                         |
+----------------+---------+-----------------------------------------------------------------------------------+
| long           | 8 bytes | Stores whole numbers from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
+----------------+---------+-----------------------------------------------------------------------------------+
| float          | 4 bytes | Stores fractional numbers. Sufficient for storing 6 to 7 decimal digits           |
+----------------+---------+-----------------------------------------------------------------------------------+
| double         | 8 bytes | Stores fractional numbers. Sufficient for storing 15 decimal digits               |
+----------------+---------+-----------------------------------------------------------------------------------+
| char           | 2 bytes | Stores a single character/letter or ASCII values                                  |
+----------------+---------+-----------------------------------------------------------------------------------+
| boolean        | 1 bit   | Stores true or false values                                                       |
+----------------+---------+-----------------------------------------------------------------------------------+

引用数据类型

引用数据类型是指对象。除了Java中的String和数组,大多数类型并未由编程语言定义。值为引用类型的变量可以为空(null),它存储所引用对象的地址。 引用类型和非基本数据类型的大小相同,并且引用类型可以用于调用方法以执行某些操作。

在声明引用类型时需要分配内存。在Java中,我们使用new关键字来分配内存,或者通过调用工厂方法来实现。

示例:

List< String > strings = new ArrayList<>() ;  // Calling `new`  to instantiate an object and thereby allocate memory.

Point point = Point(1,2) ;           // Calling a factory method.

1
@OleV.V. 我已经修改了它。 - Jayani Sumudini

2
简单来说,原始类型是数据类型,而引用类型是指针,它们不保存值,而是指向值并用于/与对象一起使用。
原始类型:
布尔型
字符型
字节型
短整型
整型
长整型
浮点型
双精度型
有很多良好的参考资料可以解释这些基本概念。 http://www.javaforstudents.co.uk/Types

0

区别在于,无论你为基本变量 PV 分配什么值,实际的值就是与变量 PV 关联的,而不是该值的引用。另一方面,无论你为引用变量 RV 分配什么值,与变量 RV 关联的都是该值的引用,而不是值本身。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接