day02 【数据类型转换、运算符、方法入门】
今日内容
- 数据类型转换
- 算数运算符
- 比较运算符
- 逻辑运算符
- 三元运算符
- 简单方法定义和调用
教学目标
- 理解数据类型的自动转换 【小转大】
- 理解数据类型的强制转换 【大转小 (转换的类型)】
- 了解ASCII编码表【128个字符和数字的对应表 0–48 a–97 A–65 】
- 理解int类型和char类型的运算原理(char的提升为int类型)
- 理解运算符++ --的运算方式( 独立 混合)
- 在变量前【先算后用】
- 在变量后【先用后算】
- 理解 + 符号在字符串中的作用(拼接 连接) (String)
- 理解比较运算符
- 理解逻辑运算符
- 掌握三元运算符的格式和计算结果 数据类型 变量名 = 布尔表达式 ? 真值:假值 ; double i= 1>2? 1:2;
- 了解方法的概念
- 掌握无返回值无参数方法的定义格式 public static void 方法名 (){ 逻辑代码}
- 了解方法定义的注意事项 类中方法外 方法不能嵌套
第一章 数据类型转换(TypeCast)
变量定义赋值的时候, 值得在取值范围之内. 如果超出了接收类型的范围, 需要强转
1.1 自动转换 (隐式转换)
1)自动转换概念
代码执行过程中取值范围小的类型
自动转换为取值范围大的类型
。
不同分类的数据类型,不能够论字节大小.
阅读如下代码,说出每个打印语句的打印的值。
System.out.println(1);//默认是一个整型int
System.out.println(1.0);//打印的是double类型
int i1=1; // 左边变量的类型和右边数值的类型是没有问题的。
double d1=1.0;// 左边变量的类型和右边数值的类型是没有问题的。
//把一个int类型的数据赋值给double类型,会有问题么?
double d2= 1;
System.out.println(d2);
进行编译 和 运行 没有问题 ,第8行输出的数据并非 1
而是1.0
。
运行的过程中,int类型的数据自动转化为double类型的数据了。也就是类型的自动转化(隐式转换)
2)转换规则
范围小的类型向范围大的类型转换,但是注意**byte、short、char
运算过程中直接转换为int
** 。
byte、short、char < int < long < float < double
练习:代码实践证明**byte、short、char
运算时直接提升为int
** 。
byte b1=1;
byte b2=1;
byte b3=b1+b2; //会报错么?会的话要怎么写?
System.out.println(b3);
short s1=1;
short s2=1;
short s3=s1+s2;//会报错么?会的话要怎么写?
System.out.println(s3);
char c1=1;
char c2=1;
char c3=c1+c2;//会报错么?会的话要怎么写?
System.out.println(c3);
1.2 强制转换
我们在上面已经知道了,当int类型的数据赋值给double类型的数据是完全没有问题的。但是现在我们反着干,我们要把double类型的数据赋值给int类型的变量,会发生什么事情呢?做个试验瞧瞧
int i1=2.0;
System.out.printl(i1);
报错!!编译失败了!!
int i1=2.0; // 错误: 不兼容的类型: 从double转换到int可能会有损失
道理很好理解,int
数据类型的取值范围小 其类型 容纳不下double
类型数据;
一定要这么干!!!!怎么办呢?!!只有通过强制类型转换,将double
类型强制转换成int
类型才能赋值。
int i1=(int)2.2;
System.out.printl(i1);
完美输出了数据,但是后面的小数是没有了!!
1)强制转化的概念
概念理解:取值范围大的类型
强制转换成取值范围小的类型
。
转换格式:
int i1 = (int) 1.0;
数据类型 变量名 = (数据类型)被转数据值;
与自动转换的区别,自动转换时是Java自动执行的不需要我们参与,而强制转换需要我们自己手动执行。
2)转换原理图解
我们再做一个实验说明下转换的原理。
我们知道byte占有一个字节,取值范围是 [-128,127]
,我定义一个byte类型的变量,赋值一个在它范围之外的一个数,比如257。来看精彩效果!!
因为超出了byte范围之外,所以要强转。那么计算结果是什么呢?
byte b1=(byte)257;
System.out.println(b1);
通过编译运行,我们可以得到的一个结果是 1
,那么怎么来的呢?看下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K8M4Hjh1-1575363436853)(img/1526549972053.png)]
3)强转有风险,操作需谨慎!!!
- 精度损失:浮点转成整数,直接取消小数点,可能造成数据损失精度。
- 数据溢出:
int
强制转成byte
砍掉3个字节,可能造成数据丢失。
int i=(int)3.9;// i=3 小数点去掉了,精度损失
byte b=(byte)257;// b=1 只拿到一个字节的数据,其余三个字节丢失(数据溢出)
1.3 ASCII编码表
在计算机的内部都是二进制的0、1数据,如何让计算机可以直接识别人类文字的问题呢?就产生出了编码表的概念。
编码表 就是将人类的字符和一个十进制数进行对应起来组成一张表格。表中每个文字都对应了一个数值,如下:
字符 | 数值 |
---|---|
0 | 48 |
9 | 57 |
A | 65 |
Z | 90 |
a | 97 |
z | 122 |
将所有的英文字母,数字,符号都和数字进行了对应**,因此产生了世界上第一张编码表**ASCII
(American Standard Code for Information Interchange 美国标准信息交换码)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zYVYKoT5-1575363436854)(assets/ASCII编码表.png)]
UTF-8
char c = ‘a’;
在编码中每个字符
都对应了一个数值
。如果要进行数值运算,字符是可以代表其对应的数值的。比如
char 2个字节 的范围 [0,65535] 216 =65536
char c= ‘0’
对于一个字符: 人认识的字符, 计算机认识的数字
‘a’ - 97
char转int:char类型转换为int类型进行计算。
int i1='A'; //类型的自动提升
System.out.println(i1);//打印出结果数值:65
System.out.println('A'+1);//打印出结果:66
int转char:int的数值也可以强转为char类型的数据,输出字符。
int i2=97;
char c1=(char)i2; //[0,65535]
System.out.println(c1);//打印出结果为字符 a
思考:
-
如何实现大小写字母的转换 ?
每个大小写字符的差值是固定
如果小写转换为大写----> 小写字符 - 32
如果是大写转换为小写 --> 大写字符 + 32
第二章 运算符(Operator)
运算符其实就是操作变量或者是常量的符号
2.1 算数运算符
算数运算符包括: | |
---|---|
+ | 加法运算,字符串连接运算 |
- | 减法运算 |
* | 乘法运算 |
/ | 除法运算 |
% | 取模运算,两个数字相除取余数 |
++ 、 -- | 自增自减运算 |
本身这些加减乘除模跟我们小学时学的运算符功能是一致,但是我们要注意他们运算时候的一些特点如下:
2.1.1 运算符两侧的类型一致
运算符两侧的类型一致时,运算的结果也是和运算的数据类型一样的但(byte,short,char类型例外,他们会自动转换为int)。
int i1=100;
int i2=200;
int i3=i1+i2;//i1和i2都是int类型。结果可以赋值给int类型的i3
int i4=i1*i2;
在数据类型自动转换的时候讲过**byte,short,char在运算的时候是直接自动提升为int类型的。**再巩固下:
byte b1=10;
byte b2=20;
//byte b3=b1+b2;//错误: 不兼容的类型: 从int转换到byte可能会有损失
int b3=b1+b2; //需要用int类型的变量接收,因为运算结果提升为int了。
System.out.println(b3);
同样,当short,char在混合运算的过程中,也是自动提升为int类型的。课后请实践下,加深印象。
2.1.2 运算两侧的类型不一致
当算术运算两侧的类型不一致的时候,结果和大类型保持一致
。
double d1=100;
int i1=10;
// int i2=d1+i1;//错误: 不兼容的类型: 从double转换到int可能会有损失
double i2=d1+i1;
2.1.3 ++,-- 运算符
++
运算,变量自增长1。--
运算,变量自减少1。用法一致,效果相反。
1)独立运算
变量在独立运算时,前++和后++没有区别 ,**都是实现自动加1的功能**。
变量前++ :例如 ++i
变量后++ :例如 i++
int i=1;
i++;//可以放在变量的后边 自动加1
System.out.println(i);// 输出结果为:2
++i;//也可以放在变量的前面 自动加1
System.out.println(i);// 输出结果为:3
2) 混合运算
和其他变量放在一起,先++
和后++
就产生了不同。
先++\--
:先运算后取值
int i1 = 1;
int i2 = ++i1;
System.out.println(i1);//计算结果是2
System.out.println(i2);//计算结果是2
变量a自己加1,将加1后的结果赋值给b,也就是说a
先 +1
计算得到2
,然后复制给b
,
因此,a和b的结果都是2。
后++\--
:先取值后运算
int a = 1;
int b = a++;
System.out.println(a);//计算结果是2
System.out.println(b);//计算结果是1
变量a
先把自己的值1
赋值给变量b
,此时变量b
的值就是1
。然后变量a
再去自己再加1
。
因此,a
的结果是2
,b
的结果是1
。
2.1.4 +
字符串中的拼接操作
+
符号在遇到字符串的时候,表示==连接、拼接==的含义。
“a”+"b"的结果是“ab”,连接含义
System.out.println("5+5="+5+5);//输出5+5=55
注意:当道和加法运算结合在一起的时候,要注意用() 提升运算优先级
int i6 =5;
int i7= 6;
System.out.println(i6+"x"+i7+"="+i6*i7);
//当道和加法运算结合在一起的时候,要注意用() 提升运算优先级
System.out.println(i6+"+"+i7+"="+(i6+i7));
2.2 赋值运算符
运算符 | 说明 |
---|---|
= | 等于号 |
+= | 加等于 |
-= | 减等于 |
*= | 乘等于 |
/= | 除等于 |
%= | 取模等 |
1)赋值运算符=
将=
右边的值,赋给左边的变量。其实我们昨天在学习定义变量的时候就接触了。如:
int i1 = 5; //将整数常量5赋值给i1。
int i2 =i1; //将i1变量的值赋值给i2变量。
int i3 =i1+i2; //将i1+i2的运算结果赋值给变量i3
10 = 100
2)+= ,-=,*=,/=,%=
算术运算符和赋值运算符的结合使用。当运算的时候,有时我们会遇到如下运算需求:
int i1=10;
i1=i1+100;//变量自身参与运算,结果赋值返回给自身
i1+=100;
System.out.println(i1);
int i2 =10;
i2=i2*10;
i2*= 10;
int i3=10;
i3=i3%3;--> i3%=3;
可以使用运算符和赋值符号相结合:
int i1=10;
i1+=100;// i1=i1+100; 变量自身参与运算,结果赋值返回给自身
System.out.println(i1);
3)+= ,-=,*=,/=,%=:自动类型强转功能
在运算过程中,如果涉及到值强转,会自动操作不需要我们干涩。
byte b1=1;
//b1= b1+ 256;//编译报错
b1+=256;
System.out.println(b1);//值为1,而不是257. int 强转为 byte ,溢出
int i1=10;
i1*=1.234;
System.out.println(i1);//值为12,而不是12.34 double 强转为 int ,精度损失
2.3 比较运算符
比较运算符 | 说明 |
---|---|
== | 比较符号两边数据是否相等,相等结果是true。 |
< | 比较符号左边的数据是否小于右边的数据,如果小于结果是true。 |
> | 比较符号左边的数据是否大于右边的数据,如果大于结果是true。 |
<= | 比较符号左边的数据是否小于或者等于右边的数据,如果小于结果是true。 |
>= | 比较符号左边的数据是否大于或者等于右边的数据,如果大于结果是true。 |
!= | 不等于符号 ,如果符号两边的数据不相等,结果是true。 |
比较运算符,是两个数据之间进行比较的运算,运算结果都是布尔值true
或者false
。
public static void main(String[] args) {
System.out.println(1==1);//true
System.out.println(1<2);//true
System.out.println(3>4);//false
System.out.println(3<=4);//true
System.out.println(3>=4);//false
System.out.println(3!=4);//true
}
2.4 逻辑运算符
逻辑运算符其实就是**与(并且),或(或者),非(不是)
**,用来连接两个布尔类型结果
的运算符。其运算结果都是布尔值(true
或false
)
1>2 并且 1<2 false 并且 true -->false
逻辑运算符 | 称呼 | 使用说明 |
---|---|---|
&& | 双与 短路与 | 1. 两边都是true,结果是true 2. 一边是false,结果是false **短路特点:**一假即假。符号左边是false,右边不再运算,效率比单与高。 |
|| | 短路或 双或 | 1. 两边都是false,结果是false 2. 一边是true,结果是true **短路特点:**一真即真,符号左边是true,右边不再运算,效率比单或高 |
! | 取反 | 1. ! true 结果是false 2. ! false结果是true |
**1)**逻辑运算符的普通使用
//逻辑与(并且) 一假即假
System.out.println(true && true);//true
System.out.println(true && false);//false
System.out.println(false && true);//false,右边不计算
//逻辑或(或者)一真即真
System.out.println(false || false);//falase
System.out.println(false || true);//true
System.out.println(true || false);//true,右边不计算
//逻辑非(不是)
System.out.println(!false);//true
2) &&短路测试 一假即假
int i1=1;
int i2=1;
// 短路 false && true
System.out.println(++i1<1 && i2++>1);//false
System.out.println(i1); //2
System.out.println(i2); //1
3)|| 短路测试 一真即真
// ||(短路或) 一真即真
int i1=1;
int i2=1;
// 短路 true || true
System.out.println(++i1>1 || ++i2>1);
System.out.println(i1);//2
System.out.println(i2);//1
2.5 三元运算符
三元运算符: 操作三个数据进行运算.
++: 一元运算符
当一个**布尔表达式(条件运算)**的结果( true 或者 false) 需要对应两种不同的结果时, 我们可以使用三元运算符.
表达式可: 由变量
或常量
和操作符
组成的式子构成。
比如: 成绩>= 60 分 ? true 及格 : false 不及格
在java中 布尔表达式 ? 真值结果 : 假值结果
什么是表达式: 我们使用运算符去连接若干个变量或者是常量时 1>2 -->false a
格式如下:
1)三元运算符格式:
数据类型 变量名 = 布尔类型表达式 ? 真值 : 假值;
int score=80;// 如果大于等于60 及格 否则 不及格
String status = score>=60 ? "及格" : "不及格" ; // 不及格
System.out.println(status); // score=80 及格 score=59 不及格
2)三元运算符执行顺序:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-if15uY0D-1575363436855)(img/三元运算符运算顺序.png)]
- 布尔类型表达式结果是true,三元运算符整体结果为
真值
,赋值给变量。 - 布尔类型表达式结果是false,三元运算符整体结果为
假值
,赋值给变量。
public static void main(String[] args) {
int a=1;
int b=2;
//a>b么?是 c=true,不是 c=false
boolean c= a>b ? true : false;
int i = (1==2 ? 100 : 200);
System.out.println(i);//200
int j = (3<=4 ? 500 : 600);
System.out.println(j);//500
}
注意: 后面真值和假值的数据类型要和 变量接收的类型要==匹配== (一致或者是满足自动类型转换)
第三章 方法入门 (Method)
3.1 概述
我们在学习运算符的时候,都为每个运算符单独的创建一个新的类和main方法,我们会发现这样编写代码非常的繁琐,而且重复的代码过多。能否避免这些重复的代码呢,就需要使用方法来实现。
那么什么是方法呢?
Java方法是语句的集合,它们在一起执行一个功能。
- 方法是解决一类问题步骤的有序组合
- 方法包含于类或对象中( 面向对象)
- 方法在程序中被创建,在其他地方被引用
方法的优点
- 使程序变得更简短而清晰。
- 有利于程序维护。
- 可以提高程序开发的效率。
- 提高了代码的重用性。
3.2 方法的定义
- 定义格式:
方法的声明(头)
修饰符 返回值类型 方法名 (参数列表)
方法体
{
代码...
代码...
代码...
return ;//方法的结束 返回对应的值
}
public static void main (String[] args)
{
逻辑代码
代码
}
//参照main方法,方法名改下,参数列表删掉
- 定义格式解释:
- 修饰符: 目前固定写法
public static
。 - 返回值类型: 目前固定写法
void
,其他返回值类型在后面的课程讲解。 - 方法名:(小驼峰)为我们定义的方法起名,满足标识符的规范,用来调用方法。
- 参数列表: 目前无参数, 带有参数的方法在后面的课程讲解。
- return:方法结束。因为返回值类型是void,方法大括号内的return可以不写。
- 修饰符: 目前固定写法
- 举例:
public static void methodName() {
System.out.println("这是一个方法");
}
3.3 方法的调用
方法在定义完毕后,方法不会自己运行,必须被调用才能执行,我们可以在主方法main中来调用我们自己定义好的方法。在主方法中,直接写要调用的方法名字就可以调用了。
public static void main(String[] args) {
//调用定义的方法method
method();
}
//定义方法,被main方法调用
public static void method() {
System.out.println("自己定义的方法,需要被main调用运行");
}
3.4 调用练习
将三元运算符代码抽取到自定义的方法中,并调用。
public static void main(String[] args) {
//调用定义的方法operator
operator();
}
//定义方法,方法中定义三元运算符
public static void operator() {
int i = 0;
i = (1==2 ? 100:200);
System.out.println(i);
int j = 0 ;
j = (3<=4 ? 500:600);
System.out.println(j);
}
3.5 注意事项
-
方法定义时
方法的位置
注意事项:- 必须定义在类中方法外
- 不能定义在另一个方法的里面即方法不能嵌套
public class Demo {
public static void main(String[] args){
}
//正确写法,类中,main方法外面可以定义方法
public static void method(){}
}
public class Demo {
public static void main(String[] args){
//错误写法,一个方法不能定义在另一方法内部
public static void method(){}
}
}
第四章 JShell脚本工具
JShell脚本工具是JDK9的新特性
什么时候会用到JShell
工具呢,当我们编写的代码非常少的时候,而又不愿意编写类,main方法,也不愿意去编译和运行,这个时候可以使用JShell工具。
启动JShell工具,在DOS命令行直接输入JShell
命令。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lCkv4ZY3-1575363436856)(img/jshell开启.jpg)]
接下来可以编写Java代码,无需写类和方法,直接写方法中的代码即可,同时无需编译和运行,直接回车即可
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yBIZUgz9-1575363436856)(img/jshell使用.jpg)]
小贴士:
JShell工具,只适合片段代码的测试,开发更多内容,建议编写在方法中。
第五章 扩展知识点
5.1 常量和变量的运算
下面的程序有问题吗?
public static void main(String[] args){
byte b1=1;
byte b2=2;
byte b3=1 + 2;
byte b4=b1 + b2;
System.out.println(b3);
System.out.println(b4);
}
分析:b3 = 1 + 2
,1
和 2
是常量,为固定不变的数据,在编译的时候(编译器javac),已经确定了1+2
的结果并没有超过byte类型的取值范围,可以赋值给变量b3
,因此b3=1 + 2
是正确的。
反之,b4 = b2 + b3
,b2
和 b3
是变量,变量的值是可能变化的,在编译的时候,编译器javac不确定b2+b3的结果是什么,因此会将结果以int类型进行处理,所以int类型不能赋值给byte类型,因此编译失败。
在jshell中体现:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bDo7SfmH-1575363436857)(img/扩展.jpg)]
常量直接运算把结果赋值变量时:
编译的是时候,可以直接获取结果,确定是否超过变量类型的范围