讲解:值类型,引用类型
-------------------------------------------------------------------------------
有很多同学学过C语言,知道C语言可以声明指针类型的变量。那就会问,java中有没有指针呢?您一定要明确回答:“java中没有指针”。问题并没有到此终结,您要紧接着说“但java底层封装了指针”。对,Java底层封装了指针,但我们要说java中没有指针,也就是不能创建指针类型的变量。
但也并不是所有的类型都封装了指针,根据这点不同,java的数据类型分为两类,即:值类型(基本数据类型)和引用类型。
² 值类型:又称基本数据类型和基元数据类型。
没封装指针的变量,它们在java中只有8个,其中大部分我们前几章已经学些过,包括int, short, float, lang, double, char, boolean, byte。这里大家发现它们首字母小写,所以它们并不是类,也没有属性和方法。声明值类型变量,只会在栈中分配一块内存空间。
² 引用类型:就是底层封装指针的数据类型。
这部分包含的比较多,包括或自定义或系统提供的所有类;后面学习的所有抽象类,接口;以及前面学习使用的所有数组。他们在内存中分配两块空间,第一块内存分配在栈中,只存放别的内存地址,不存放具体数值,我们也把它叫指针类型的变量,第二块内存分配在堆中,存放的是具体数值,如对象属性值等。
下面我们看一个综合案例,首先我们看一个类Student的代码:
Class Student { // 属性:由变量实现 String stuId; String stuName; int stuAge;
// 行为:由函数(方法)实现 void lesson(String lessonName) { System.out.println("我在上" + lessonName + "课"); } } |
关于Student类,旺旺就不做过多的解释,我们看如何创建这个类的对象,我们知道,通过类名对象名 = new 类名()创建对象。则有下列代码:
Class RunStudent { public static void main(String[] args) { // Student是自定义类,是指针类型变量,分配两块内存空间 Student zhouxingxing = new Student(); // String类是系统类,也是指针类型变量,分配两块内存空间 String name = new String("旺旺"); // int,char是值类型,只分配一块内存空间 int a = 10; char b = ‘m’;
// 对象名.属性名访问对象的属性,访问包括赋值和取值 zhouxingxing.stuId = "9527"; zhouxingxing.stuName = "周星星"; zhouxingxing.stuAge = 25;
} } |
则Student zhouxingxing = new Student();这行代码在内存中就创建了两块内存空间,第一块在栈中,名字叫zhouxingxing,它就相当于指针类型的变量,我们看到它并不存放学生姓名年龄等具体的数值,而是存放堆中第二块内存的地址35DF(实际使用中这里的内存地址不一定是35DF,请大家注意),第二块才存放具体的数值,如学生编号,姓名,年龄等信息。如下图所示:
还有数组内部也封装了指针,即便是基本数据类型的数组,也封装了指针,数组也是引用类型。比如代码int[] arr = new int[]{23,2,4,3,1};如下图所示:
旺旺老师教学视频下载地址:http://www.verycd.com/groups/@g481346/790989.topic,欢迎大家下载