1.数据类型
在Java中数据类型主要分为两类:基本数据类型和引用数据类型。
基本数据类型有四类八种: 1. 四类:整型、浮点型、字符型以及布尔型
2.八种:
整形是分为如上四种 byte short int long
浮点型分为 float 和double
其中需要特别注意的是 byte内存占用为1字节 char内存占用为2字节。和我们之前c语言中学到的很不一样。
需要注意的点
1.不论是在16位系统还是32位系统,int都占用4个字节,long都占8个字节。其他数据类型也同理(可以说这不像c语言一样,其java是可移植的,无论在哪个系统,其数据类型所占字节都是固定的)
2.在java中整形和浮点型都是有符号的,不存在无符号。(跟c的区别,c有无符号和有符号之分,更加复杂)
3.整型默认为int型,浮点型默认为double
4字符串属于引用类型,该中类型后序介绍。
2.变量
对于java来说 ,其为了安全性 ,变量在使用前是需要定义好值的,否则如果没定义好值就使用会导致编译期间报错。(这在c语言里是不可能的,C语言就算变量未定义也是可以使用的)
对于给变量赋值,其值一定不要超出其变量取值范围
1.整形
特殊说明:在整形中,长整型变量(long)的初始值后要加L或者l,推荐加L。 (其他整形变量都没这个要求)
2.浮点型
int a = 1;
int b = 2;
System.out.println(a / b); //输出0
跟c语言一样。在 Java 中, int 除以 int 的值仍然是 int(会直接舍弃小数部分),。如果想得到 0.5, 需要使用 double 类型计算.
double a = 1.0;
double b = 2.0;
System.out.println(a / b); // 输出0.5
double float 类型的内存布局遵守 IEEE 754 标准(和C语言一样), 尝试使用有限的内存空间表示可能无限的小数, 势必会存在一定的精度误差,因此浮点数是个近似值,并不是精确值。这个叫做精度损失,之前在c语言中讲过。
所以会出现以下代码,就是精度损失的一个很好的例子。
double num = 1.1;
System.out.println(num * num); // 输出1.21吗?
// 执行结果
1.2100000000000002
因为java更注重安全性,所以对于将float初始化,需要将其浮点型常量后面加个f或者F,否则会报错(c语言并不会报错)
float num = 1.0f; // 写作 1.0F 也可以
由于float表示的数据精度范围较小, 一般在工程上用到浮点数都优先考虑 double, 不太推荐使用 float.
3.字符型
Java 中使用 单引号 + 单个字母 的形式表示字符。
无论是哪种语言,计算机中的字符本质上都是属于整数. 在 C 语言中使用 ASCII 表示字符, 而 Java中我们使用Unicode表示字符.
unicode中一个字符占用两个字节,所以可以表示的字符种类更多, 包括中文.
char ch = '呵';
System.out.println(ch);
4.布尔类型
boolean 类型的变量只有两种取值, true 表示真, false 表示假
Java 的 boolean 类型和 int 不能相互转换, 不存在 1 表示 true, 0 表示 false 这样的用法.(强制转换双方都不能进行)
(c语言中bool能与int类型相互转换,所以0能隐式转换为true,其他数字能隐式转换为false,)
Java虚拟机规范中,并没有明确规定boolean占几个字节,也没有专门用来处理boolean的字节码指令
3.类型转换
Java 作为一个强类型编程语言, 当不同类型之间的变量相互赋值的时候, 会有较严格的校验.而跟c语言对比来说,c语言的类型转换规则就显得很宽松,很容易就能类型转换。
自动类型转换(隐式)
自动类型转换即:代码不需要经过任何处理,在代码编译时,编译器会自动进行处理。特点:数据范围小的转为数据范围大的时才会自动转换。(特殊情况不遵循,如下)
(c语言的隐式转换更简单,无论是小转换为大还是大转换为小都可以)
当给变量赋常量值时,其隐式转换并不符合上述所说,它的隐式转换有自己的规矩,其规则我们在上面已经说过了,再说一遍。
将一个字面值常量进行赋值的时候, Java 会自动针对数字范围进行检查。
byte,short只要填整数常量就行,它会自动隐式整换。int填整数常量。 long需要整数常量后加个L如101L. float在赋值时需要后面加个f如1.14f 。double只要正常浮点数就行.
强制类型转换(显式)
c语言已经讲的很清楚,这里不详细展示
强制类型转换不一定能成功,不相干的类型依旧不能互相转换 ,如在java中boolean和int之间不能强制转换(c语言当然可以)
4.类型提升
如果参与计算的都是低于等于4字节大小的数据类型,就会将其提升到四字节类型再计算。原因是由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据. 为了硬件上实现方便, 诸如 byte 和 short 这种低于 4 个字节的类型, 会先提升成 int, 再参与计算.
如果有大于4个字节类型的数据参与计算,如long,则就全隐式转换为long类型再计算。
下面给几个例子
所以这就是java的类型提升。
其实对于类型转换和类型提升这两个概念在c语言就讲过了,只不过java跟c语言在这两方面上还是有差别的,所以要重新讲。
5.字符串类型
这是c语言所没有的类型,但是c语言有指针可以代替它。
字符串类型不属于java的基本类型,属于引用数据类型。
在Java中使用String类定义字符串类型,比如:
public static void main(String[] args) {
String s1 = "hello";
String s2 = " world";
System.out.println(s1);
System.out.println(s2);
System.out.println(s1+s2); // s1+s2表示:将s1和s2进行拼接
}
在java中,字符串跟c语言中字符串不一样,这里结尾并不存在隐藏的\0,所以在从底层来说可以将字符串认为是数组。
在java中字符串可以被+拼接 ,如“hello”+4=“hello4” ,10+20+“hello”=“30hello”,“hello”+10+20=“hello1020”.
对于其转换方法运用了包装类型和String,该知识点比较深,就不细展开了,看一下了解下就可以了。