如何区分引用类型和原始类型
下表列出了原始类型以及它们的对象封装类。
原始类型和封装类
原始类型 | 封装类 |
boolean | Boolean |
char | Character |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
引用类型和原始类型的行为完全不同,并且它们具有不同的语义。例如,假定一个方法中有两个局部变量,一个变量为 int
原始类型,另一个变量是对一个 Integer
对象的对象引用:
int i = 5; // 原始类型 Integer j = new Integer(10); // 对象引用 |
这两个变量都存储在局部变量表中,并且都是在 Java 操作数堆栈中操作的,但对它们的表示却完全不同。(本文中以下部分将用通用术语 堆栈代替操作数堆栈或 局部变量表。)原始类型 int
和对象引用各占堆栈的 32 位。(要表示一个 int
或一个对象引用,Java 虚拟机实现至少需要使用 32 位存储。) Integer
对象的堆栈项并不是对象本身,而是一个对象引用。
Java 中的所有对象都要通过对象引用访问。对象引用是指向对象存储所在堆中的某个区域的指针。当声明一个原始类型时,就为类型本身声明了存储。前面的两行代码表示如下:
引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null
,而原始类型实例变量的缺省值与它们的类型有关。
许多程序的代码将同时包含原始类型以及它们的对象封装。当检查它们是否相等时,同时使用这两种类型并了解它们如何正确相互作用和共存将成为问题。程序员必须了解这两种类型是如何工作和相互作用的,以避免代码出错。
例如,不能对原始类型调用方法,但可以对对象调用方法:
int j = 5; j.hashCode(); // 错误 //... Integer i = new Integer(5); i.hashCode(); // 正确 |
使用原始类型无须调用 new
,也无须创建对象。这节省了时间和空间。混合使用原始类型和对象也可能导致与赋值有关的意外结果。看起来没有错误的代码可能无法完成您希望做的工作。例如:
import java.awt.Point; class Assign { public static void main(String args[]) { int a = 1; int b = 2; Point x = new Point(0,0); Point y = new Point(1,1); //1 System.out.println("a is " + a); System.out.println("b is " + b); System.out.println("x is " + x); System.out.println("y is " + y); System.out.println("Performing assignment and " + "setLocation..."); a = b; a++; x = y; //2 x.setLocation(5,5); //3 System.out.println("a is "+a); System.out.println("b is "+b); System.out.println("x is "+x); System.out.println("y is "+y); } }
这段代码生成以下输出:
a is 1 b is 2 x is java.awt.Point[x=0,y=0] y is java.awt.Point[x=1,y=1] Performing assignment and setLocation... a is 3 b is 2 x is java.awt.Point[x=5,y=5] y is java.awt.Point[x=5,y=5]
修改整数 a
和 b
的结果没什么意外的地方。 b
的值被赋予整型变量 a
,结果 a
的值增加了 1。这一输出反映了我们希望发生的情况。但是,令人感到意外的,是在赋值并调用 setLocation
之后 x
和 y
对象的输出。我们在完成 x = y
赋值 之后特意对 x
调用了setLocation
, x
和 y
的值怎么会相同呢?我们毕竟将 y
赋予 x
,然后更改了 x
,这与我们对整数 a
和 b
进行的操作没什么不同。
这种混淆是由原始类型和对象的使用造成的。赋值对这两种类型所起的作用没什么不同。但它可能看起来所有不同。 赋值使等号 (=) 左边的值等于右边的值。这一点对于原始类型(如前面的 int a
和 b
)是显而易见的。对于非原始类型(如 Point
对象),赋值修改的是对象引用,而不是对象本身。因此,在语句
x = y; |
之后, x
等于 y
。换句话说,因为 x
和 y
是对象引用,它们现在引用同一个对象。因此,对 x
所作的任何更改也会更改 y
。下面是 //1 处的代码执行以后的情况:
执行 //2 处的赋值以后情况如下:
当在 //3 处调用 setLocation
时,这一方法是对 x
引用的对象执行的。因为 x
引用的 Point
对象也正是 y
所引用的对象,所以我们现在得到以下结果:
因为 x
和 y
引用同一个对象,所以对 x
执行的所有方法与对 y
执行的方法都作用于同一个对象。
区分引用类型和原始类型并理解引用的语义是很重要的。若做不到这一点,则会使编写的代码无法完成预定工作。
转自:http://zhaohe162.blog.163.com/blog/static/3821679720123110755469/?suggestedreading&wumii
如何区分引用类型和原始类型相关推荐
- 引用类型和原始类型区别
Java 提供两种不同的类型:引用类型和原始类型(或内置类型).另外,Java 还为每个原始类型提供了封装类(Wrapper).如果需要一个整型变量,是使用基本的 int 型呢,还是使用 Intege ...
- 引用类型和原始类型的对比(java)
Java 提供两种不同的类型:引用类型和原始类型(或内置类型).另外,Java 还为每个原始类型提供了封装类(Wrapper). 原始类型 封装类 ================= boolean ...
- 《JavaScript面向对象精要》——第1章 原始类型和引用类型1.1 什么是类型
本节书摘来自异步社区<JavaScript面向对象精要>一书中的第1章,第1.1节,作者:[美]Nicholas C. Zakas 译者: 胡世杰 更多章节内容可以访问云栖社区" ...
- 《JavaScript面向对象精要》——第1章 原始类型和引用类型 1.1 什么是类型
本节书摘来自异步社区<JavaScript面向对象精要>一书中的第1章,第1.1节,作者:[美]Nicholas C. Zakas著,更多章节内容可以访问云栖社区"异步社区&qu ...
- java 中的原始类型与原始封装类型
Java 提供两种不同的类型:引用类型和原始类型(或内置类型) 文章目录 一.原始与对应的封装类 二.引用类型和原始类型的区别: 三.总结: 比如: Int是java的原始数据类型,Integer是j ...
- 原始类型与封装类的区别
Integer是int的封装类,里面有很多进行处理的静态方法 Integer是对象而int不是,内存的分配位置也不一样 int是一种基本数据类型,而Integer是相应于int的类类型,称为对象包 ...
- primitive type java_Java的原始类型(Primitive Type)
我们知道,在Java中,变量有两种类型,一种是原始类型,一种是引用类型. 原始类型一共有8种,它们分别是char,boolean,byte,short,int,long,float,double.在J ...
- java原始类型_Java的原始类型(Primitive Type) | 学步园
我们知道,在Java中,变量有两种类型,一种是原始类型,一种是引用类型. 原始类型一共有8种,它们分别是char,boolean,byte,short,int,long,float,double.在J ...
- Java中的原始类型与原始封装类型
在写Java代码的过程中,一直对Java提供的一些类参数又疑问,今天查了一下,进行了解学习. type argument cannot be of primitive type 问题: Java中什么 ...
最新文章
- 第1关:最长非降子序列(非连续)问题
- linux 查进程对应用户,linux进程状态查询
- 阿里发布2019十大科技趋势,5G仍是主要生产力
- 今天看到一个很个性的blog
- python向端口发出数据_Python写的简单的端口监听,显示端口上收到的数据,TCP的...
- C什么k什么_K线图基础知识丨什么是K线散兵坑形态?K线散兵坑形态的操作与案例详解...
- leetcode 706. 设计哈希映射
- 助力全站WebP ,阿里云云上FPGA 团队发布 WebP图片解决方案
- Java开发常用命名规范
- Arcgis for Android 空间数据WKT与JSON描述
- CodeForces 617 E. XOR and Favorite Number
- 大数据的应用:九大领域
- adb 配置自动获取时间 使用GPS提供的时间 使用网络提供的时间
- 【第一组】第八次冲刺例会纪要
- 基于retinex理论改进的低照度图像增强算法
- 编写php自动脚本,自己编写自动签到脚本
- 李宏毅2021春季机器学习课程视频笔记1:Introduction, Colab PyTorch Tutorials, HW1
- 软件项目任务分解的概念
- 超详细“CIDR地址块及其子网划分”
- 软考高级五大证书,哪个更值得考?