【第二章】Java中的数据类型,运算符与程序逻辑控制
上一章我们介绍了JavaSE的历史与Java程序的特点,那么从本章开始,我们就从Java语言的细节入手。从数据类型,运算符和程序逻辑控制三个方面来介绍,这里与C语言的很多内容都相似甚至相同。所以说有些东西在进行记录的时候就一笔带过。下面从数据类型开始。
数据类型
数据类型这一章分为基本数据类型和引用数据类型。基本数据类型就是我们在定义变量的时候可以使用到的数据类型。而引用数据类型则是基于Java语言OOP(Object Oriented Programming)面向对象的特性进行的,后续会在后续《类与对象》这一章中详细记录。
这一部分内容会参考C语言当中的部分语法拓展介绍,详情可以参考这一篇文章:
基本数据类型
数据类型大致分为四类:整型,浮点型,字符型以及布尔类型。
Java中的基本数据类型共有八种,它们所对应的取值范围、包装类如下图所示:

注:
1.由于Java中JVM的跨平台的特性,内存占用不论在哪个平台上都是不变的
2.整型和浮点型都是带有符号的
3.在不明确指定详细的数据类型的前提下,默认整型为int,而浮点型为double
4.包装类是把基本数据类型转换为引用数据类型的一种方法,具体的使用会在后续的章节讲到。
5.所以类型可以通过包装类名.Max_Value或者Min_Value进行获取当前对应基本数据类型的取值范围
变量
在程序中,除了有始终不变的常量外,有些内容可能会经常改变,比如:人的年龄、身高、成绩分数、数学函数的计算结果等,对于这些经常改变的内容,在Java程序中,称为变量。而数据类型就是用来定义不同种类变量的。
基本的格式如下:
数据类型 变量名=初始值;
这就是我们一般所写的定义格式。对于变量,可以分为成员变量和局部变量。这里我们所探讨的是局部变量,也就是方法内的变量。在进行赋初值的时候我们也可以在定义后赋值,但是必须注意:
变量在使用之前必须要赋初值,否则编译报错
这与C语言如出一辙,这里就不再赘述。
常量(字面量)
介绍完变量以后,我们来了解一下常量。常量就是字面量,在程序运行期间,固定不变的量就是常量。比如说我们所写的1,3.34,'A',"JVG"等的一些数据。这就是常量,它是不可变的。
类型转换与提升
在《C语言的入门与精通》专栏中,我们介绍了C语言具有算术转换与整型提升的特性,那么对应的,Java语言也有这个特性。Java语言在进行数据类型不同的转换的时候,也会有隐式和显示的转换。以下面两个例子为例:
第一个例子:
java
public class testDemo1 {
public static void main(String[] args) {
byte a=10;
byte b=30;
byte c=a+b;
}
}
在编译时就出现编译错误。

原因在于整型之间进行运算的时候,如果不显示的指定数据类型,那么整型默认是int,而浮点类型默认是double。这里很明显编译器是把byte自动进行了类型的提升,提升为了整型int,如果想要赋值,把接收的变量类型改为int或者对整个式子进行强制类型转换即可。
第二个例子:
java
public static void main(String[] args) {
int a=100;
long b=100l;
b=a;
a=b;
}

进行编译的时候,第一行不会报错,而第二行会报错,为什么🤔?
原因就是在Java中,赋值时,大范围的值往小范围的值进行赋值的时候,能够成功赋值,因为数据不会丢失。但是相反则不行,编译器会产生数据类型丢失的警告。
那么上述文章就是数据类型的转换的常见的误区,通过两个例子来展示。
字符串类型
在C语言当中,字符串类型主要以字符串常量和字符数组的方式存在,而在C++中,我们可以使用模版类String来进行对于字符串的修改。那么在Java中,也提供了字符串的使用的方法------String类。
String类是不可变的对象,因为它的底层是一个不可变的字节数组的对象。

这个知识我们会在后面的类与对象章节当中讲到。
在有些情况下,我们需要进行数据与字符串之间的转换,转换的方式主要有以下两种:
1.将数据转换为字符串
java
public static void main(String[] args) {
int num=10;
//方法一:字符串化
String s1=""+num;
//方法二:调用字符串的API
String s2=String.valueOf(num);
}
2.将字符串转换为数据
java
public static void main(String[] args) {
//调用包装类的方法
String str="1000";
int num=Integer.parseInt(str);
System.out.println(num);
}
注意:这里如果字符串中包含了非法数据,比如说"1000abc",JVM则会抛出异常。
这就是我们在进行数据转换的时候所采取的方式。那么Java中的数据类型到此结束,下面是Java中的运算符号的介绍。
运算符
运算符除了常规算术运算符的±、*、/、%运算符外,还有关系运算符,逻辑运算符,位运算符。下面介绍一些运算符的注意事项。
算术运算符
基本四则运算
基本四则运算符的算术规则同数学的运算规则,但是也有下面几个问题要注意:
1.如果运算符号两边都是整型发生除法运算时,如果产生小数,则会让小数进行向下取整的操作。
java
public static void main(String[] args) {
int a=100;
int b=8;
System.out.println(a / b);
}

2.除数不能为0,如果是0,则会抛出ArithmeticException(算数异常)
java
public static void main(String[] args) {
System.out.println(10/0);
}

3.%不仅可以对整型取模,也可以对double类型取模,但是没有意义,一般都是对整型取模的
java
public static void main(String[] args) {
System.out.println(10%2);
System.out.println(12.5%2);
}
在C语言中,%运算符并不能够对于小数取模,但是Java里面是可以的,这一点要特别注意。

增量运算符
增量运算符可能听起来比较高大上,其实上就是把两个运算符进行复合了。常见的有+=、-=,*=,/=,%=。其实上就是把算术运算符复合了,比如:
a+=10 的本质就是a=a+10 ,这里与C语言一样,故不再赘述。
但还是有一点需要注意,增量运算符在进行计算的时候,不需要进行强制类型转换。
java
public static void main(String[] args) {
double a = 10.4;
int b = 10;
b += a;
}
这样写,程序可以编译通过并且正常运行,但是如果写:**a=a+b;**程序自动从小的类型向大的类型转换。
自增/自减运算符
与C语言一样,不再赘述。
逻辑运算符
逻辑运算符有"&&、||、~、&、|" ,其中&&和||与C语言一样,是逻辑上的短路与和短路或。这里就不再赘述,但是&和|也是与运算和或运算,但是不同点在于,他们不会有短路现象。

结合上述代码,就可以很好的印证上述的观点。
位运算符和移位操作符
位运算符与C语言相同,这里不再赘述。
移位操作符
移位操作符上分为左移操作符、右移操作符。而在C语言当中,左移操作符与Java当中一样。而在右移操作符部分。C语言中右移操作符分为算术右移和逻辑右移。
1.算术右移:算术右移在最高位会补充符号位,如果是1就右移后补1,反之则补0,这是gcc、msvc编译器所默认的
2.逻辑右移:逻辑右移在最高位无脑补0
这是我们所确定的C语言当中右移操作符的两种特性,而在Java语言当中,算术右移不变,依然是>>,而逻辑右移在Java中也叫无符号右移,它的格式也被改变了,改为>>>。这就是Java中的无符号右移。
上面所讲的内容是我们在Java当中所需要注意的要点。
程序逻辑控制
Java当中,程序的逻辑与C语言一样,详细参考下面这篇文章:
然后在Java语言当中,还有一些问题需要注意
1.Java中,表示真假类型的数据只有boolean类型数据,要么是true,要么是false,不存在C语言中0表示假,非0表示真的问题
2.switch语句中,switch可以匹配byte、short、char、int的基本数据类型,引用类型只会匹配String,其他类型均会报错,这一点要注意。
好的,那么本章三个要点就已经介绍完毕了,我们本文主要是依附于C语言中的语法进行介绍的。大家学习的时候最好把C语言也学习一遍,毕竟"C生万物"嘛!下一章,我们会为大家介绍Java的输入输出,数组等知识,喜欢的朋友记得给个三连呦,我们下一章不见不散~