1.概述
数据:计算机能够处理数值、文字、声音、图形、图像等信息,均称为数据。
数据类型:根据数据描述信息的含义,将数据分为不同的种类,对数据种类的区分规定,称为数据类型。数据类型的不同,则在内存中的存储结构也不同,占用空间也不同。
在java中将数据类型分为两大类:基本数据类型、引用类型。(在内存中的存储方式不同)。
具体什么是基础数据类型和引用类型,还要通过对内存进行分析之后,才能真正明白他们的不同。
所以要从计算机工作原理开始入手。了解了变量、常量、对象、代码等等在内存当中是怎样进行存储的,才能更好的解释数据类型。
马老师的课程中经常强调对内存的分析。只有从根上理解了,那么对程序本身的理解才够深刻。
2.计算机工作原理
计算机是怎样进行工作的,这些硬件是怎样相互配合完成任务的。请看下图是对硬盘和内存工作流程的一个简单分析:
如图所示,程序在加载时,程序代码将拷贝到内存当中。通过JRE的解读,转换成操作系统代码执行java程序(在执行期间有很多地方需要分析内存这就是 图四-D-2 的右侧方框,他诠释了内存的组成部分)。
3.内存分析
常量、变量、数据类型的包装类的对象等在内存中存储的方式是完全不同。
首先,将内存分为四部分:heap(堆)、stack(栈)、data segment(数据区)、code segment(代码区)。
常量的存储方式:
常量是在数据区开辟空间,保存值!
变量的存储方式:
每声明一个变量都会在栈中分配一块空间(大小和声明的变量类型有关),而这一块控件当中有一部分是来存放变量名称的,有一部分是存放变量的值的。变量的存储方式如右图所示。
数据类型包装类的对象的存储方式:
每new一个对象出来都会在栈中保存一个对象的名称。在堆中实例化一个对象出来。栈中的对象名称指向堆中的对象。
用马老师的话说就是所有new出来的东西都在堆中。
数据类型包装类的对象存储方式如右图。
由上述内存分析,得知定义某个数据类型的变量都是直接在栈中开辟空间,定义数据类型乃至任何自定类型的“变量”确切的说是对象时需要引用。
那么基本数据类型就是定义这种类型的变量直接在内存中开辟空间就可以了。而数据类型包装类的对象是需要进行引用的。
下面阐述java中的基本数据类型和引用类型。
4.数据类型
<1> 数据类型分类
在java中共有4类8种基本数据类型分别是:
1) 逻辑型 —— boolean
2) 文本型 —— char
3) 整数型 —— byte、short、int、long
4) 浮点数型—— float,double
<2>对比学习
这些基本数据类型和我们之前学习的vb 和c# 中的数据类型略有不同。下面我们将结合vb和C#语言的数据类型对java的数据类型进行分析。(各种语言的基本数据类型都差不多,今后的学习再总结其他的)
下面列出类这三种语言所包含的数据类型和各个数据类型的取值范围。我们对这三张图表进行分析、总结他们之间有什么样的异同之处。
Java中的数据类型
Vb中的基本数据类型:
C#数据类型
从三张图标对比发现,基本数据类型语言中都大同小异,而C#和java的更是相似。这里应该是和语言的类型有关系。 Vb属于面向过程的编程语言,而C#和java都是面向对象开发的语言。
第一,java和C#都出现了一种新的数据形式——引用类型。所谓引用类型就是实例化出数据类型包装类的对象出来。Vb为什么没有呢?vb本身就没有封装这些方法和属性的功能。在vb当中,数据类型是数据类型,转换函数是转换函数,完全都是分开的。而在java中对其进行了封装,某一种数据类型具有哪些转换函数都包装在于其相对应的类当中。也有利于开发人员的使用,写完对象名称之后一“点”所有的方法就都有提示了。
第二,能够表示的数据范围变大了,之前int和long 都 降了一级,应为他们之前表示的范围相对于java和C#中的表示范围就太小了。
C# 先对于java还增加了一些单独描述符号的数据类。
第三,vb中的一些描述具体类型的数据类型(如:日期类型、货币类型等)在java和C#中都不存在了,因为这些类型都可以用其他的数据类型代替。例如:日期类型的数据在java中是用String表示的。这样的做法在我们之前的工程实践中也使用过,在vb中不适用Date数据类型而用string。
5.变量作用域
Java中变量作用域和其他语言的作用域规定方式相同。
只是在名称有所改变,更名为:成员变量(类内变量)、局部变量(方法内变量)。这两种变量在vb中都叫局部变量,之前vb6虽然可以写面向对象的代码,但是毕竟较少。在vb6中还有全局变量,vb中也尽量不适用,java中内有了。
Java程序中变量的作用域非常好判断,因为java程序都是由“{}”框起来的。变量一旦出了这个框就失效了!
6.数据类型转换
Java语言中是如何进行数据类型转换的?有哪些特殊之处? 虽然java将数据类型的转换函数都封装到数据类型包装类当中了,那数据转换之间有哪些要求和条件呢?
<1> boolean类型不可以转换为其他的数据类型
<2>×××,字符型,浮点型的数据在混合运算中相互转换,转换时遵循以下规则:
a. 容量小的类型自动转换为容量大的数据类型;数据类型按容量大小排序为:
l Byte,short,char -> int -> long -> float -> double
l Byte,short,char之间不能转换,他们三者在计算时首先转换为int类型。
b.容量大的数据类型转换为容量小的数据类型时,加强制转换符,但可能照成精度降低或溢出。
C.有多种数据混合运算时,系统首先自动的将所有数据转换成容量最大的哪一种数据类型,再进行计算。
通过上述描述,基本上和其他语言中的数据转换相同,只有在使用强制转换上格式有些差异!
E、运算符
运算符包含的种类这里就不再罗列了,这里主要是说明一下
在java中, 最大地区别就在“+”。
在Java中,“+”两边如果都是数字,那当然就进行运算了!只要“+”两边有一个是字符串(String)类型。那就会把“+”两边的内容链接起来。(把数字转换成字符串)。
而在之前vb当中, 这个“+”作为连接符之前,如果两边都是字符串那么就链接起来作用如同“&”。如果只有一边是字符串,一边是数字,那就会尝试把字符串转换成数字。如果是纯数字型的字符串,那就会加起来。