Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 486|回复: 0

[Java基础知识]引用类型和原始类型

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-1 15:02:24 | 显示全部楼层 |阅读模式
    java 提供两种不同的类型:引用类型和原始类型(或内置类型)。另外,Java 还为每个原始类型提供了封装类(Wrapper)。        如果需要一个整型变量,是使用基本的 int 型呢,还是使用 Integer 类的一个对象呢?如果需要声明一个布尔类型,是使用基本的 boolean,还是使用Boolean 类的一个对象呢?本文可帮助您作出决定。 下面列出了原始类型以及它们的对象封装类。��
    原始类型���    封装类
    ��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。
      
    ��因为 x 和 y 引用同一个对象,所以对 x 执行的所有方法与对 y 执行的方法都作用于同一个对象。 ��区分引用类型和原始类型并理解引用的语义是很重要的。若做不到这一点,则会使编写的代码无法完成预定工作。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-4 16:46 , Processed in 0.390475 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表