# 第二章 数据类型和运算符
# JAVA基础语法
[TOC]
# 注释
# 为什么要有注释?
# 注释的概念
注释是在程序指定位置添加的说明性信息
简单理解,就是对代码的一种解释
单行注释:
//注释信息
多行注释:
/*
注释信息
*/
2
3
文档注释:
注释的使用细节
注释内容不会参与编译和运行,仅仅是对代码的解释说明
不管是单行注释还是多行注释,在书写的时候都不要嵌套
# 关键字
被Java赋予了特定含义的英文单词
关键字字母全部小写
常用的代码编辑器,针对关键字有特殊的颜色标记,非常直观
# Class关键字
class:用于(创建/定义)一个类,类是Java最基本的组成单元
类就类似于人类的细胞,人类是有很多种细胞组成的
Java项目也是通过无数的类来组成的
# 总结
1.什么是关键字?
被Java赋予了特定含义的英文单词,它会在编辑器里面高亮显示
2.关键字的特点?
- 关键字的字母全部小写
- 常用的代码编辑器,对关键字有特殊颜色标记
3.class关键字是什么意思?
class关键字表示定义一个类,后面跟随类名
# 字面量
告诉程序员:数据在程序中的书写格式
字面量类型:
字面量类型 | 说明 | 举例 |
---|---|---|
整数类型 | 不带小数点的数字 | 666,-88 |
小数类型 | 带小数点的数字 | 13.14,-5.21,5.20 |
字符串类型 | 用双引号括起来的内容 | "helloworld" |
字符类型 | 用单引号括起来的,内容只能有一个 | 'A','a' |
布尔类型 | 布尔值,表示真假 | 只有两个值:true,false |
空类型 | 一个特殊的值,空值 | 值是null |
# 变量
# 什么是变量呢?
变量:在程序的执行过程中,其值有可能发生改变的量(数据)
# 变量使用场景?
当某数据经常发生改变时,我们也可以用变量存储,当数据变化时,只要修改变量里面记录的值即可
# 变量的定义格式
数据类型 变量名 = 数据值;
目前先给大家介绍两个数据类型:
数据类型 | 关键字 |
---|---|
整数 | int |
浮点数 | double |
# 变量的基本用法
//定义变量
//数据类型 变量名 = 数据值;
//数据类型:限制了变量能存储数据的类型
//变量名:就是存储空间的名字,作用方便之后的代码使用
//数据值:真正存储在变量中的数据
//等号:赋值。把右边的数据赋值给左边的变量
int a = 10;
System.out.println(a);
double b = 10.10;
System.out.println(b);
2
3
4
5
6
7
8
9
10
# 变量的使用方式
# 第一种:输出打印
int a = 10;
System.out.println(a);
2
# 第二种:参与计算
int a = 10;
int b = 20;
System.out.println(a + b);
2
3
# 第三种:修改记录的值
int a = 10;
System.out.println(a);//10
a = 20;
System.out.println(a);//20
2
3
4
# 变量的注意事项
只能存一个值
变量名不允许重复定义
一条语句可以定义多个变量
int a,b,c = 10;
变量使用之前一定要进行赋值
# 变量小结
1.定义格式
数据类型 变量名 = 数据值;
2.使用变量
输出打印
参与计算
修改记录的值
3.使用场景
重复使用某个值
某个数据经常发生改变
4.注意事项
变量只能存一个值
# 变量的练习
一开始没有乘客
第一站:上去一位乘客
第二站:上去两位乘客,下来一位乘客
第三站:上去两位乘客,下来一位乘客
第四站:下来一位乘客
第五站:上去一位乘客
请问:到了终点站,车上一共几位乘客
# 常量
在Java中还有一个概念叫做常量,变量的值是可以改变的,但是常量是不可以改变的
常量
:在程序运行过程中,其值不可以发生改变的量
格式
:
final 数据类型 常量名 = 数据值;
实例
:
final double PI = 3.14;
常量用final来修饰,并且赋值之后其值是不能改变的,常量的命名一般来说都是大写
案例
:
计算圆的面积
final double PI = 3.14;
int r = 2;
double area = PI * r * r;
System.out.prinltn(area);
2
3
4
常量类型 | 说明 | 举例 |
---|---|---|
字符串常量 | 用双引号括起来的内容 | "HelloWorld" "lanqiao" |
整数常量 | 不带小数的数字 | 666,-88 |
小数常量 | 带小数的数字 | 13.14,-5.21 |
字符常量 | 用单引号括起来的内容 | 'A','0','我' |
布尔常量 | 布尔值,表示真假 | 只有两个值,true,false |
空常量 | 一个特殊的值,空值 | 值是:null |
# 数据类型
在Java中数据类型分为两类,基本数据类型和引用数据类型
# 基本数据类型
四类八种
基本数据类型:
Java语言的数据类型分为:基本数据类型和引用数据类型
数据类型取值范围大小关系:
double>float>long>int>short>byte
long类型变量:需要加上L标识(尽量大写)
float类型变量:需要加入F标识(尽量大写)
# 输出爱人信息
姓名:段某人(String)字符串
年龄:18(int)
性别:女(char)
身高:180(double)
是否单身:否(true)
爱好:xxx()
# 输出电影信息
需求:将(电影名称,主演,年份,评分)四个信息选择不同类型的变量,打印在控制台
# 输出手机信息
# 标识符
# 标识符概述
标识符:就是给类,方法,变量起名字的符号
由数字,字母,下划线和美元符号$组成
不能以数字开头
不能是关键字
区分大小写
判断下面哪些变量不符合规则:
# 常见的命名约定
小驼峰命名法:
- 约定:标识符是一个单词的时候,首字母小写
- 范例1:name
- 约定2:标识符由多个单词组成的时候,第一个单词首字母小写,其他单词首字母大写
- 范例2:firstName
大驼峰命名法:
- 约定1:标识符是一个单词的时候,首字母大写
- 范例1:Student
- 约定2:标识符由多个单词组成的时候,每个单词的首字母大写
- 范例2:GoodStudent
# 类型转换
# 自动类型转换(默认的)
把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量
小转大
表示数据范围从小到大
byte<short<int<long<float<double
范例:
int a = 10;
double d = a;
2
# 自动类型转换的两种提升规则
取值范围小的,和取值范围大的进行运算,小的会先提升为大的,再进行运算
byte short char 三种类型的数据在运算的时候,都会直接先提升为int 然后在进行运算
范例:
int a = 10;
double b = 10;
数据类型? c = a+b;
2
3
byte a = 10;
byte b = 10;
数据类型? c = a+b;
2
3
byte<short<int<long<float<double
总结:
取值范围:
byte<short<int<long<float<double
什么时候转换:
数据类型不一样,不能进行计算,需要转成一样的才可以计算
转换规则1:
取值范围小的,和取值范围大的进行运算,小的会先提升为大的,再进行运算
转换规则2:
byte short char 三种类型的数据在运算的时候,都会直接先提升为int 然后在进行运算
案例:
byte b1 = 10;
byte b2 = 20;
数据类型 result = b1+b2;
2
3
int i =10;
long n = 100L;
double d = 20.0;
数据类型 result = i+n+d;
2
3
4
byte b = 10;
short s = 20;
long n = 100L;
数据类型 result = b + s +n;
2
3
4
# 强制类型转换(强转)
把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量
大转小
大转小是不允许直接赋值的,如果一定要这么做就需要加入强制转换
- 格式:目标数据类型 变量名 = (目标数据类型)值或者变量;
- 范例:int k = (int)88.88;
double a = 12.3;
int b = (int)a;
2
强制类型转换不推荐使用,因为会数据丢失
案例:
编码过程中,不但能将数字赋值给某个变量,还能将一个变量赋值给另一个变量。比如下面代码把整型变量changjiang赋值给整型变量longRiver:
// 长江的长度为6397千米
int changjiang = 6397;
System.out.println("changjiang="+changjiang);
int longRiver = changjiang; // 把一个整型变量赋值给另一个整型变量
System.out.println("longRiver="+longRiver);
2
3
4
5
运行上面的测试代码,发现两个整型变量的数值一模一样。
同类型的变量之间互相赋值完全没有问题,麻烦的是给不同类型的变量赋值。要是把整型变量赋值给长整型变量,则发现编译器直接提示错误,此时需要在原变量前面添加“(新类型)”表示强制转换类型。改写后的变量赋值语句就变成了下面这样:
// 不同类型的变量相互赋值,需要在原变量前面添加“(新类型)”表示强制转换类型
long longRiver = (long) changjiang; // 把整型变量赋值给长整型变量
2
然而,不同类型的变量相互赋值是有风险的,尤其是把高精度的数字赋值给低精度的数字,例如将八字节的长整型数强制转成四字节的整型数,结果只有低位的四个字节保留了下来,而高位的四个字节被舍弃掉了。下面做个实验,先用长整型变量保存世界人口的数量74亿,再把该长整型变量赋值给整型变量,具体代码如下所示:
// 截至2018年元旦,世界人口大约有74亿
long worldPopulation = 7444443881L;
System.out.println("worldPopulation="+worldPopulation);
// 把长整型数赋值给整型数会丢失前四个字节
int shijierenkou = (int) worldPopulation; // 把长整型数强制转成整型数
System.out.println("shijierenkou="+shijierenkou);
2
3
4
5
6
运行以上的实验代码,打印出来的变量值见以下日志:
worldPopulation=7444443881
shijierenkou=-1145490711
2
可见长整型数强制转成整型数,结果整个数值都变掉了。
既然整数之间强制转换类型存在问题,小数之间的类型强制转换也不例外。倘若把双精度数强制转换成浮点数,数字精度也会变差。接下来仍然通过实验进行观察,以常见的圆周率为例,它的密率是中国古代数学家祖冲之发现的,其数值为3.1415926,包括小数部分在内共有8位数字。由于double类型的数字精度达到15到16位,因此利用双精度变量保存圆周密率完全没有问题。但是如果将这个密率的双精度变量赋值给浮点变量,又会发生什么情况?下面的代码就演示了把双精度数强制转成浮点数的场景:
// 3.1415926是中国古代数学家祖冲之求得的圆周率数值,又称祖率
double zulv = 3.1415926;
System.out.println("zulv="+zulv);
// 把双精度数赋值给浮点数会丢失数值精度
float pai = (float) zulv; // 把双精度数强制转成浮点数
System.out.println("pai="+pai);
2
3
4
5
6
运行上述实验代码,日志打印的变量值见下:
zulv=3.1415926
pai=3.1415925
2
可见浮点变量保存的密率数值变成了3.1415925,与双精度变量相比,末尾的6变为5。之所以密率数值发生变化,是因为float类型的数字精度只有6到7位,而前述密率的总位数达到8位,显然超出了float类型的精度范围,使得强转之后的浮点变量损失了范围外的精度。
除了整数之间互转、小数之间互转以外,还有整数转小数和小数转整数的情况,可是整数与小数互转依然存在数值亏损的问题。譬如一个双精度变量赋值给一个整型变量,由于整型变量没有空间保存小数部分,因此原本双精度变量在小数点后面的数字全被舍弃。以下代码就示范了这种数字类型转换的例子:
double jiage = 9.9;
System.out.println("jiage="+jiage);
// 把小数赋值给整型变量,会直接去掉小数点后面部分,不会四舍五入
int price = (int) jiage; // 把双精度数强制转成整型数
System.out.println("price="+price);
2
3
4
5
运行以上的测试代码,日志打印结果如下:
jiage=9.9
price=9
2
果然整型变量丢掉了双精度变量的小数部分,由此可见,不同类型之间的变量互转问题多多,若非必要,一般不进行两个变量的类型强制转换操作。
# 算术运算符
# 运算符和表达式
运算符:对常量或者变量进行操作的符号
表达式:
用运算符把常量或者变量连接起来符合Java语法的式子就可以被称为表达式
不同运算符连接的表达式体现的是不同类型的表达式。
举例说明:
int a = 10;
int b = 20;
int c = a + b;
+:是运算符,并且是算术运算符
a+b:是表达式,由于+是算术运算符,所以这个表达式也被称为算术表达式
代码演示:
//定义两个变量
int a = 6;
int b = 4;
System.out.println(a+b);
System.out.println(a-b);
System.out.println(a*b);
System.out.println(a/b);
System.out.println(a%b);
//除法得到的是商,取余得到的是余数
//整数相除只能得到整数,要想得到小数,必须有浮点数的参与
System.out.println(6.0/4);
2
3
4
5
6
7
8
9
10
11
注意事项:
/和%的区别:两个数据做除法,/取结果的商,%取结果的余数。
整数相除只能得到整数,要想得到小数,必须有浮点数的参与
# 字符的"+"操作
拿字符在计算机底层对应的数值来计算的
算术表达式中包含多个基本数据类型的值的时候,整个算术表达式的类型会自动进行提升。
提升规则:
- byte类型,short类型和char类型将被提升到int类型
- 整个表达式的类型自动提升到表达式中最高等级操作同样的类型
- 等级顺序:byte,short,char=>int=>long=>float+double
char a = 'A';
char b = 'a';
int c = a + b;
2
3
# 字符串的"+"操作
案例:
System.out.println("lan"+"qiao");//lanqiao
System.out.println("lanqiao"+666);//lanqiao666 字符串
System.out.println(666+"lanqiao");//666lanqiao 字符串
System.out.println(666+"lanqiao"+666);//666lanqiao666 字符串
System.out.println(1+10+"lanqiao");//11lanqiao 字符串
2
3
4
5
当"+"操作中出现字符串时,这个"+"是字符串连接符,而不是算术运算
- "lanqiao"+666
在”+”操作中,如果出现了字符串,就是连接运算符,否则就是算术运算。当连续进行“+”操时,从左到右逐个执行。
- 1+10+"lanqiao"
# 赋值运算符
//把10赋值给了int类型的变量i
int i = 10;
System.out.println("i:"+i);
//+=
//i+= 20;
i = i+20;
//注意:扩展的赋值运算符底层隐含了强制类型转换
short s =10;
s+=20;
//s =(short)(s + 20);
System.out.println("s:"+s);
2
3
4
5
6
7
8
9
10
11
12
注意事项:
扩展的赋值运算符隐含了强制类型转换
# 自增自减运算符
代码演示:
单独使用自增运算符
int i = 10;
i++;
++i;
System.out.println("i:"+i);
2
3
4
++,--如果不是单独使用(如在表达式中,或者同时有其他操作),放在变量前后会存在明显区别
代码演示:
放在变量的前面,先对变量进行+1或者-1,再拿变量的值进行运算
int a = 10;
int rs = ++a;
2
放在变量的后面,先拿变量的值进行运算,再对变量的值进行+1或者-1
int a = 10;
int rs = a++;
2
注意事项:
- ++和--即可以放在变量的后边,也可以放在变量的前边
- 单独使用的时候,++和--无论是放在变量的前边还是后边,结果都是一样的
- 参与操作的时候,如果放在变量的后边,先拿变量参与操作,后拿变量做++或者--
- 参与操作的时候,如果放在变量的前边,先拿变量++或者--,后拿变量参与操作
最常见的用法:单独使用
案例
int a = 2;
int b = ++a + ++a;
2
int a = 2;
int b = ++a + a++ + ++a;
2
都需要输出a和b的值
# 关系运算符
代码演示:
//定义变量
int i = 10;
int j = 20;
int k = 10;
//==
System.out.println(i == j);
System.out.println(i == K);
//!=
System.out.println(i != j);
System.out.println(i != K);
//>
System.out.println(i > j);
System.out.println(i > K);
//>=
System.out.println(i >= j);
System.out.println(i >= K);
//如果不小心把== 写成了 =
System.out.println(i = j);
//把j的值赋值给了i,然后输出i的值
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
注意事项:
关系运算符的结果都是boolean类型,要么是true,要么是false
千万不要把"=="写成"="
# 逻辑运算符
在数学中,一个数据x,大于3,小于6,我们可以这样来进行表示:3<x<6
但是在Java中,需要把上面的式子先进行拆解,再进行合并表达
拆解为:x>3和x<6
合并后:x>3 && x<6
&&其实将就是一个逻辑运算符
我们可以这样说,逻辑运算符,是用来连接关系表达式的运算符。 当然,逻辑运算符也可以直接连接布尔类型的常量或者变量。
代码演示:
int i = 10;
int j = 20;
int k = 30;
//&
System.out.println(i>j & i>k);
System.out.println(i<j & i>k);
System.out.println(i>j & i<k);
System.out.println(i<j & i<k);
2
3
4
5
6
7
8
int i = 10;
int j = 20;
int k = 30;
//丨
System.out.println(i>j | i>k);
System.out.println(i<j | i>k);
System.out.println(i>j | i<k);
System.out.println(i<j | i<k);
2
3
4
5
6
7
8
int i = 10;
int j = 20;
int k = 30;
//^
System.out.println(i>j ^ i>k);
System.out.println(i<j ^ i>k);
System.out.println(i>j ^ i<k);
System.out.println(i<j ^ i<k);
2
3
4
5
6
7
8
int i = 10;
int j = 20;
int k = 30;
//!
System.out.println(i>j);
System.out.println(!(i<j);
2
3
4
5
6
# 短路逻辑运算符
符号 | 作用 | 说明 |
---|---|---|
&& | 短路与 | 如果左边为true,右边执行;如果左边为false,右边不执行,结果为false; |
|| | 短路或 | 如果左边为false,右边执行;如果左边为true,右边不执行,结果为true; |
代码演示:
int i = 10;
int j = 20;
int k = 30;
//&
System.out.println(i>j && i>k);
System.out.println(i<j && i>k);
System.out.println(i>j && i<k);
System.out.println(i<j && i<k);
2
3
4
5
6
7
8
注意事项:
逻辑与&,无论左边真假,右边都要执行。 短路与&&,如果左边为真,右边执行;如果左边为假,右边不执行。
逻辑或|,无论左边真假,右边都要执行。 短路或||,如果左边为假,右边执行;如果左边为真,右边不执行。
# 三元运算符
格式:关系表达式?表达式1:表达式2;
范例:a>b?a:b;
计算规则:
首先计算关系表达式的值
如果值为true,表达式1的值就是运算结果
如果值为false,表达式2的值就是运算结果
代码演示:
int a = 10;
int b = 20;
int max = a>b? a:b;
System.out.println("max:"+max);
2
3
4
案例:两只老虎
需求:动物园里面有两只老虎,已知两只老虎的体重分别为180kg,200kg,请用程序判断两只老虎体重是否相同
分析:
1.定义两个变量用于保存老虎的体重,单位为kg,这里体现数值就可以了
2.用三元运算符实现老虎体重的判断
案例:三个和尚
需求:一座寺庙里面住着三个和尚,已知他们的身高分别为150cm,210cm,165cm,请使用程序实现获取这三个和尚的最高身高
# 数据输入
Scanner数据输入
Scanner的使用步骤
1.导包
2.创建对象
3.接收数据
最好是在接收数据的前面给用户一个提示
案例:三个和尚plus版本
分析:身高未知,采用键盘录入的方式
键盘录入三个身高分别赋值给三个变量