Java编程入门:引用类型和原始类型的区分

2016-02-19 21:02 7 1 收藏

下面,图老师小编带您去了解一下Java编程入门:引用类型和原始类型的区分,生活就是不断的发现新事物,get新技能~

【 tulaoshi.com - 编程语言 】

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。下面是 //1 处的代码执行以后的情况:

执行 //2 处的赋值以后情况如下:

当在 //3 处调用 setLocation 时,这一方法是对 x 引用的对象执行的。因为 x 引用的 Point 对象也正是 y 所引用的对象,所以我们现在得到以下结果:

因为 x 和 y 引用同一个对象,所以对 x 执行的所有方法与对 y 执行的方法都作用于同一个对象。

区分引用类型和原始类型并理解引用的语义是很重要的。若做不到这一点,则会使编写的代码无法完成预定工作。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

来源:http://www.tulaoshi.com/n/20160219/1625112.html

延伸阅读
标签: Java JAVA基础
     一些初学JAVA的朋友可能会遇到JAVA的数据类型之间转换的苦恼,例如,整数和float,double型之间的转换,整数和String类型之间的转换,以及处理、显示时间方面的问题等。下面笔者就开发中的一些体会介绍给大家。     我们知道,Java的数据类型分为三大类,即布尔型、字符型和数值型,而其中数值型又分为整型...
热播动画片《喜羊羊与灰太狼》深受各年龄层的喜爱,个性分明的角色里,似乎能看到我们自己的影子。在此,我们不妨把青青草原看成职场,与职场专家一起,看看你是职场里的哪一只羊。多分享自己的想法,虚心听取他人意见。经常是板着脸孔,装出很前卫的模样,以为自己英伟不凡、天下无敌,却不知道,好多事情自己其实一...... ...
枚举中有values方法用于按照枚举定义的顺序生成一个数组,可以用来历遍。我们自定义的枚举类都是继承自java.lang.Enum,拥有一下实例中的功能: 代码如下: //: enumerated/EnumClass.java // Capabilities of the Enum class import static net.mindview.util.Print.*; enum Shrubbery { GROUND, CRAWLING, HANGING } public class Enum...
标签: Java JAVA基础
接口是实现构件可插入性的关键,可插入构件的关键在于存在一个公用的接口,以及每个构件实现了这个接口。 什么是接口? Java中的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。 ...
布尔类型对象可以被赋予文字值true或者false,所对应的关系就是真于假的概念! 我们通常使用的方法是利用他来判定条件的真于假,例如如下的代码: C++ 代码 //程序作者:管宁 //站点:www.cndev-lab.com //所有稿件均有版权,如要转载,请务必闻名出处和作者 #include iostream using ...

经验教程

838

收藏

85
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部