初认识java
数据类型
一、数据类型与变量
1、数据类型
数据类型它分为两种:一种是基本数据类型(内置类型)、另外一种为引用数据类型(由于java中没有指针用引用数据类型来代替);
①基本数据类型有八种:
整数型:byte(一个字节)、short(两个字节)、int(四个字节)、long)(八个字节)
小数型:float(四个字节)、double(八个字节)
字符类型:char(两个字节)!!!注意C语言的char是一个字节,java中的是两个字节
布尔类型:boolean(没有明确的规定)
②引用数据类型:
String
数组
接口
类
…
变量
引用数据类型定义的变量,它们存储的是地址;
注意:1、无论在32位的系统下,还是在64位的系统下它们所占的内存大小都是一样的,比如:int占4个字节,long 占8个字节(从这里可以体会到java的可移植性的特点,可移植性就是无论在什么操作系统下所占内存都是一定的)2、
2、变量
变量分为两种,一种是在程序中不变的常量,另外一种则是经常发生改变的量(一个人的身高、年龄,体重巴拉巴拉的。。。)这些量我们称为变量。
首先变量是有符号的(正负号)并且在java中所有类型 定义的数据当中 都是有符号的
拿 int来举例子
整型变量
int 变量
占4个字节
long变量
long也是定义一个整型,与int的区别在于long的范围比int更大
在定义long类型的是可以在定义变量后加一个大写或小写的L,推荐加L因为大写L容易区分。
例如 long a=10L;
占8个字节
short变量
同理比int的区别在于short的范围比int的范围更小
占2个字节
byte变量
byte变量比short的范围更小,只占1一个字节,8个bite位
在java中当我们赋值给所定义类型的变量范围的最大值,java会直接编译报错,而不像C语言只给我们警告
例如:byte的范围为 -128 ~ 127
那为什么要给出这么多种数据类型呢?
打个比方当你吃一点点的时候可以拿个小碗吃饭,当想吃很多很多的时候你可以那个大碗吃饭,就是给我们更多的范围在我们选取的使用的时候使用最适合我们当前的数据
浮点类型变量
float类型 (单精度浮点数)
当我们在定义时没有加f时为什么会出现报错的情况呢?
是因为在我们没有加f的时候编译器会认为这是double类型的数据,其中里面会牵扯到类型转换;
double类型是八个字节,而float类型是一个4个字节,一个大范围的不能给一个小范围的类型;
double(双精度浮点数)
double和float的区别在于,double类型小数点后的范围比float类型更大,并且在定义浮点数的时候编译器会将小数默认定义成double类型的数据;
double占8个字节
答案是显而易见的,是不能的,因为两个数据都是int 类型,所算出的结果也是int类型的,所以会舍弃0.5;
为什么呢?应为小数是一个没有精确的数字,编译器只能给你精确到小数点后几位
关于浮点数类型在内存的存储是怎样的呢?
我先卖一个关子,下一次我会详细讲解
字符类型变量
它这里与C语言中的char类型是不一样的,java中的char类型所占的是两个字节的大小;而C语言表示的是一个字节
这意味着我们可以存储一个汉字;
汉字的所占的大小是两个字节
布尔类型
注意事项:
-
boolean 类型的变量只有两种取值, true 表示真, false 表示假.
-
Java 的 boolean 类型和 int 不能相互转换, 不存在 1 表示 true, 0 表示 false 这样的用法.
-
Java虚拟机规范中,并没有明确规定boolean占几个字节,也没有专门用来处理boolean的字节码指令,在
Oracle公司的虚拟机实现中,boolean占1个字节。
二 类型转化
在java中不同变量与不同变量存在着类型转化
而类型转化存在两种:一种是自动类型转换(隐式) 和 强制类型转换(显式)。
隐式转化
自动类型转换即:代码不需要经过任何处理,在代码编译时,编译器会自动进行处理。特点:数据范围小的转为数据范围大的时会自动进行。
强制类型转化
强制类型转换:当进行操作时,代码需要经过一定的格式处理,不能自动完成。
特点:数据范围大的到数据范围小的。
注意事项:
- 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型
- 如果需要把范围大的类型赋值给范围小的, 需要强制类型转换, 但是可能精度丢失
- 将一个字面值常量进行赋值的时候, Java 会自动针对数字范围进行检查
- 强制类型转换不一定能成功,不相干的类型不能互相转换