您的位置:首页 > 编程语言 > Java开发

<Head First Java>学习笔记--第三章:primitive主数据类型和引用

2015-04-21 19:46 851 查看
Java变量有两种:primitive主数据类型和引用。

变量就像是杯子,是一种容器,承载某些事物,它有大小与类型。

声明变量

Java注重类型,只有类型匹配的才能通过编译。像下面的就无法通过编译:

// 你不能把一个长颈鹿的类型装进兔子类型的变量中
Rabbit hopper = new Giraffe();


下面这个才能通过编译:

// 类型一定要相互匹配
Rabbit rab = new Rabbit();
Giraffe gir = new Giraffe();


引用类型与对象类型相符

但是,在后面的章节中有提到过多态,引用类型可以是实际对象类型的父类,可以是下面的声明形式:

// Animal是Dog的父类,这个是可以编译通过的
Animal myDog = new Dog();


在上面的兔子和长颈鹿中,如果Rabbit是Giraffe的父类,那么上述的声明是没问题的。但是很明显,兔子怎么可能是长颈鹿的父类,打死我都不信。

primitive主数据类型

1、存放数值的类型

如下图:存放数值的primitive主数据类型有下面6个杯子。杯子的形状都是差不多一样的,我们可以理解为它们都是primitive主数据类型。大小不一样表示它们存放的数值大小是不一样的。



2、boolean和char类型的大小

那么,问题来了。boolean和char类型跑哪里去了呢?它们分别占用多少个字节呢?也就是它们的杯子是多大的呢?

很明显,char占用16bits,也就是两个字节。但是对于boolean类型的大小,网上的答案都不是很统一。于是乎,C/C++的编程习惯来了,咱们不是可以用sizeof(xxx)来查看占用内存大小嘛。

boolean flag = true;
System.out.prinln("boolean size = %d", sizeof(flag));


上述代码果断编译不通过,too young too simple。Java是没有sizeof的操作啊。。是这么解释的:

java中的内存管理任务直接交给了JVM,这比C++更为彻底。同时,java是一个全新设计的完全面向对象语言,不存在C++向下兼容的问题,因此,java中不存在类似sizeof的操作符

也就是说Java为了保证数据的安全,不想让程序员直接对内存进行操作。

百度找了一下关于boolean类型所占用内存大小的讨论,多数没有给出一个确切的答复。那么开始google吧。在Oracle上的社区中引用了JVM手册的相关章节解释了boolean类型占用内存的大小。翻译起来如下:

虽然Java提供了boolean类型,但是在JVM中没有提供针对boolean类型的专门指令。所以在JVM用int(4个字节)型来操作boolean类型。JVM直接支持boolean类型的数组,采用byte(1个字节)的形式去存取boolean类型。

3、primitive主数据类型的赋值

谈到赋值,我们就肯定要考虑溢出的问题。小心为妙。

对象引用

在前面的一章提到过:Java主要是对象之间的交互,那么怎么让对象交互呢,肯定是要通过对象引用来的。



解释一下第三第四句话:

对象引用变量保存的是存取对象的方法

它并不是对象的容器,而是类似指向对象的指针,或者可以说是地址。。。

前面说了,对象是存在于可回收的堆上,那么对象引用变量就不能像primitive主数据类型变量以字节来代表实际变量的值。对象引用变量是以字节来表示取得对象的方法。(我感觉我这是废话啊)

太佩服作者以遥控器来进行比喻,最形象生动不过了。





数组犹如杯架



既然说数组犹如杯架,那么就说明数组不是普通的杯子了,进而推断数组不是primitive主数据类型。很明显,可以得出:数组是对象

1、数组也是对象

那么数组有哪些实例变量和方法呢?看下面的例子ArrayTest.java:

public class ArrayTest{

public static void main(String[] args)
{
int[] array = new int[3];
int[] array1 = new int[3];
int[] array2 = array;
array[0] = 0;
array[1] = 1;
array[2] = 2;
array1[0] = 0;
array1[1] = 1;
array1[2] = 2;
System.out.println("length = " + array.length);
if(array.equals(array1))
System.out.println("array equal array1");
if(array.equals(array2))
System.out.println("array equal array2");
}
}


很明显,数组对象有一个length的示例变量(属性)标记该数组的长度一个equals的方法来判断两个对象引用变量是不是指向同一个对象。这篇文章Java数组基础关于数组给出了详细的说明。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: