这是一道过去的考试题,我想首先问一下什么是原始类型和引用类型? 对于数组,我知道引用类型是由对象或变量组成的数组,而原始类型则是只使用int或string来创建数组。(是吗?)
你认为你在考试中如何回答这个问题并获得好的分数?不直接提及原始数组类型,有没有办法回答这个问题?还是你认为只用数组解释也可以?
Person person = new Person();
,也可以使用 Person person; person.set(something); person.get()
。 - user2979872以下是Java中的基本数据类型:
其他所有类型都是引用类型:它们引用对象。
这是有关该语言基础的Java教程的第一部分。
java.lang.Object
进行强制转换。 - Nayuki基本数据类型:
引用/对象数据类型:
原始类型和引用类型:
首先:
原始类型是基本的数据类型:
byte
, short
, int
, long
, float
, double
, boolean
, char
。
原始变量存储原始值。
引用类型是任何可实例化的类以及数组:
String
, Scanner
, Random
, Die
, int[]
, String[]
等。
引用变量存储内存中数据存储位置的地址。
其次:
原始类型存储值,但引用类型存储堆空间中对象的句柄。请记住,引用变量不像您可能在C和C ++中看到的指针,它们只是对象的句柄,以便您可以访问它们并对对象状态进行更改。
这些是原始数据类型
这些数据类型保存在内存中的栈中,而栈是由管理内存的系统来管理的。相反,对象数据类型或引用数据类型存储在内存的堆中,由垃圾回收器(GC)来管理。
这是最重要的区别。
很多人已经正确或不太正确地解释了引用类型和基本类型,可能有人对于Java中更相关的类型感兴趣。以下是我所知道的Java类型的完整列表(至少包括JDK 11)。
描述一个值(而不是一种类型)。
11
描述扩展Object的具体类型(接口、类、枚举、数组)。此外,TypeParameter实际上也是一个引用类型!
Integer
? extends List<String>
? super ArrayList<String>
空无。不可能有任何值或实例。
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);
基本数据类型
基本数据类型是编程语言提供的基础类型,作为程序的基本构建块,因此是预定义的数据类型。基本类型始终具有值,它存储简单的值。
它指定变量值的大小和类型,因此基本类型的大小取决于数据类型,并且没有其他方法。
这些是该语言中保留的关键字。因此,我们不能将这些名称用作变量、类或方法名称。基本类型以小写字母开头。在声明基本类型时,我们不需要分配内存(Java中内存由JRE-Java Runtime Environment分配和释放)。
+================+=========+===================================================================================+
| 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.
区别在于,无论你为基本变量 PV 分配什么值,实际的值就是与变量 PV 关联的,而不是该值的引用。另一方面,无论你为引用变量 RV 分配什么值,与变量 RV 关联的都是该值的引用,而不是值本身。
String
(字符串)并不属于原始类型,更加准确地说应该是String
s。 - amit