云栖社区专家系列课——Java必修课第四讲

148 阅读8分钟
原文链接: click.aliyun.com

Java 必须课是零基础 Java 学习者的入门课程,涵盖了 Java 初学者应该掌握的所有核心知识。在第四讲中,最课程创始人、微软 MVP 陆敏枝详细讲解了基础类型转换、 char 类型运算、关系运算符、逻辑运算符、位运算符等基础类型之间的运算关系,并结合利息计算器应用案例将前几讲学习的知识点进行串联。


课程基本信息

开课时间:每周四下午:14 : 00-15 : 30

主讲人:云栖社区专家,陆敏枝

Java必修课在线直播视频链接:

yq.aliyun.com/video/play/…

点击此处下载本节教学课程

 

本课程重点内容

本节课程主要讲解基础类型转换、char 类型运算、关系运算符、逻辑运算符、位运算符等数据类型之间的运算关系,具体内容如下:

一、基础类型转换:自动转换和强制转换

数据类型转换通常发生在不同数据类型的数据之间运算时:

· 自动转换:从低精度->高精度 ,byte 、 short 、 int 、 long 、 float 、 double ;

·强制转换:从高精度->低精度 ,则要类型强制转换。

自动转换和强制转换的示例代码如下:

Public class OperatorTester{
public static void main(String[] args){
int a = 3;
float c = 5.17f;
c=a;//自动转换
System.out.println(c);//
a=(int)c;//强制转换
System.out.println(a);
}
} 

二、关于char的运算

Java 中 char 类型的运算要注意以下三点:

· char 与整型进行算术运算后,结果会自动提升成 int 类型;

·两个 char 型运算时,自动转换为 int 型;

·当 char 与别的类型运算时,也会先自动转换为 int 型的,再做其它类型的自动转换。

Public class OperatorTester01{
public static void main(String[] args){
char c1 = 'a'; // 对应97
int f = c1 + 10;
System.out.println("char与整型进行运算: 'a' + 10 = " + f);
//char类型之间运算
char c2 = 'b';  // 对应98
System.out.println("两个char相加: 'a' + 'b' = " + (c1 + c2)); 
//char与其他类型之间的运算
double db = c1 + 1.1d;//双精度double
System.out.println("char与别的类型相加 : 'a' + 1.1d = " + db);}
}

程序输出:

char 与 整型进行运算 : 'a' + 10 = 107

两个char 相加 : 'a' + 'b' = 195

char 与别的类型相加 : 'b' + 1.1d = 98.1

ASC 码表中规定了 char 类型与整数值的对应关系,具体关系如图:

853e8ee48a5ffb059239d37edd416382758c2630 

注:在运算中,括号是最高优先级,如上述代码中字符串相加时,System.out.println(" 两个 char 相加 : 'a' + 'b' = " + (c1 + c2)); 去掉括号后变成字符串相加,输出结果为 ab 。

 

三、关系运算符

关系运算符用于比较两个数据之间的关系,比较结果为Boolean 类型的值。关系运算符包括:等于” ==” 、不等于” !=” 、大于” >” 、大于等于” >=” 、小于” <” 、小于等于 ”<=” 。以下为关系运算符示例代码:

public static void m3() {
int a = 1;
int b = 3;
int c = 3;
float d = 3.0f;
char c1 = 'a';
char c2 = 'b';
System.out.println("1 == 3 吗," + ( a == b));
System.out.println("3 == 3 吗," + ( b == c));
System.out.println("3 == 3.0 吗," + ( c == d));
System.out.println("1 != 3 吗," + ( a != b));
System.out.println("3 > 1 吗," + ( b > a));
System.out.println("3 >= 3 吗," + ( b >= a));
System.out.println("3 < 1 吗," + ( b < a));
System.out.println("3 <= 1 吗," + ( b <= a));
System.out.println("'a' <= 'b' 吗," + ( c1 < c2));
}

输出结果为:

1 == 3 吗, false

3 == 3 吗, true

3 == 3.0 吗, true

1 != 3 吗, true

3 > 1 吗, true

3 >= 3 吗, true

3 < 1 吗, false

3 <= 1 吗, false

'a' <='b' 吗, true

注意:

(1 ) == 号和 = 的区别;

(2 ) char 类型同样可以比较大小。

 

四、逻辑运算符

在上文中我们比较了整数、小数、字符,唯独没有比较布尔型数据。为了比较布尔类型数据,我们来讲解下逻辑运算符。逻辑运算符要求操作数的数据类型为boolean 类型,其运算结果也是 boolean 类型,包括:逻辑与 '&&' 、逻辑或 '||' 、逻辑非 '!' 、逻辑异或 '^' 、逻辑与 '&' 、逻辑或 '|' 。

逻辑运算符示例代码:

Public class OperatorTester03{
public static void main(String[] args){
boolran a= true;
boolran a=false;
System.out.println("a && b"+(a&&b));
System.out.println("a || b"+(a||b));
System.out.println("!a" +(!a));
System.out.println("a ^ b"+(a^b));
System.out.println("a & b"+(a&b));
System.out.println("a | b"+(a|b));
}
}

运算结果:

a&&b=false

a||b=true

!a=false

a^b=true

a&b=true

a|b=true

下图为逻辑运算符的真值表,初学者可以根据真值表判断逻辑计算的结果:

9d3f37a44c6da93c379b61bc9e7d33d744bf4bc1 

A 和 B 是逻辑运算的两个逻辑变量,从真值表中可以看出:

1 、 A&&B 与 A&B 结果完全相同,而 A||B 与 A|B 结果也完全相同;

2 、 对于&& 运算来说,只要运算符左端的值为 false ,则因无论运算符右端的值为 true 或为 false ,其最终结果都为 false 。 所以,系统一旦判断出&& 运算符左端的值为 false ,则系统将终止其后的计算过程;因此, && 的效率就比 & 高,因为 & 进行了一些无用的并且还不影响结果的计算。

3 、 对于 || 运算来说,只要运算符左端的值为 true ,则因无论运算符右端的值为 true 或为 false ,其最终结果都为 true 。所以,系统一旦判断出|| 运算符左端的值为 true ,则系统将终止其后的计算过程。因此, || 的效率就比 | 高,因为 & 进行了一些无用的并且还不影响结果的计算。

A||B与A&&B这种提前结束的行为叫做:短路。

 

五、位运算符

在讲解位计算符之前,首先需要了解进制的概念:

1、十进制计算方法

1e0a6b1972f01896eb8064fb98bb544b3d96f5f1 

2、二进制计算方法

d2741e315956136214c4b32bae5ae65dbe7382f9 

 

15 & 6

位运算代码示例

Public class OperatorTester04{
public static void main(String[] args){
int x = 15;
int y = 6;
int z = 0;
//x等于二进制数的00001111
//y等于二进制数的00000110
//&等于二进制数的00000110= 2^2 + 2^1=6
  z = x & y;
System.out.println("x & y = " + z);
}
}

输出结果为:6

原理图:

046e54591d115d2fdfe8309faef43dce672a2fc5 

3、位运算

位运算是对整数值进行二进制运算。位运算标识符包括:位与'&',位或'|',位非'~',位异或'^',右移'>>',左移'<<',0填充的右移'>>>':

· & 运算:对二进制的位求与,参考真值表

· | 运算:对二进制的位求或,参考真值表

· ~ 运算:求非

· ^ 运算:求位异或。

· >> 运算:将一个数化成二进制右移

· << 运算:将一个数化成二进制左移

· >>> 运算:右移(补零)运算符,即无符号右移, ">>>" 永远不会产生负号,因为其符号位总是被补零。

注:位运算符更详细讲解,请参考直播视频。

 

六、其他运算符

除上述讲解的运算符外,Java 中还提供了其他各类运算符,如赋值运算符、方括号、三元运算符等,下面来一一讲解。

1、赋值运算符=

赋值运算符” =” 通常与其他运算符联合使用,具体使用方法如下图所示:

23dbefa036969d8f731ab291170480a45d262c26 

 

2、方括号[]

方括号[] 是数组运算符,括号中的数值是数组的下标。后续讲解数组方面知识时会详细讲解。

3、三元运算符

三元运算符的模式:<表达式1> ?<表达式2> : <表达式3>
三元运算符 先计算< 表达式 1> 的值,当 < 表达式 1> 的值为 true 时,则将 < 表达式 2> 的值作为结果;当 < 表达式 1> 的值为 false 时,则将 < 表达式 3> 的值作为结果。

三元运算符示例代码:

Public class OperatorTester05{
public static void main(String[] args){
int c;
c= 1 > 2 ? 1 : 2; //?前表达式为true,取值为:前面值,否则为后面的值
System.out.println(c);
}
}

输出为:2

4、强制类型转换符()

强制类型转换符能将一个表达式的类型强制转换为某一指定数据类型

示例代码:

Public class OperatorTester06{
public static void main(String[] args){
int a;
double b = 5.66600;
a = (int) b;
System.out.println(a);

输出为:5

5、对象运算符instanceof

对象运算符instanceof 用来测试一个指定对象是否是指定类(或它的子类)的实例,若是则返回 true ,否则返回 false 。

示例代码:

Public class OperatorTester07{
public static void main(String[] args){
String s = new String("str");
if(s instanceof Object){
System.out.println("s is object ");
}
}
}

输出为:String is object class

7、点运算符

点运算符"." 的功能有两个:一是引用类中成员 ; 二是指示包的层次等级。 例如:System.out() 、 import java.util.Date ;

 

七、案例:利息计算器

下面是 商用车系统的案例 中的利息计算器。

080c9c249feffa0bf1d98a62fa71cdda2497b33c 

( 网页 链 接:foton.kelasoft.com/home/comput…

在本节课中,我们利用之前所学的知识,实现一次性还本付息计算器的代码,具体如下:

import java.util.Scanner;
import java.util.Scanner;
public class InterestComputor{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你的贷款金额");
Double amount = scanner.nextDouble();
System.out.println("请输入你的贷款年利率");
Double rate = scanner.nextDouble();
System.out.println("请输入你的贷款月数");
int months = scanner.nextInt();
//amount*(rate/100.0)*(months/12.0)利息计算公式
Double rateIncome =amount*(rate/100.0)*(months/12.0);
Double totalIncome = amount + rateIncome;
System.out.println("贷款 金额"+amount);
System.out.println("贷款 月数"+months);
System.out.println("贷款年利率"+rate );
System.out.println("需偿还利息"+rateIncome );
System.out.println("本息 合计"+totalIncome );
}
}

程序运行结果

6191e813c52f754499c6d78cf100e4fa7ef34961 

代码重构,将计算过程重构成一个函数:

// 一次性还本付息

import java.util.Scanner;
public class InterestComputor{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你的贷款金额");
Double amount = scanner.nextDouble();
System.out.println("请输入你的贷款年利率");
Double rate = scanner.nextDouble();
System.out.println("请输入你的贷款月数");
int months = scanner.nextInt();
compute(amount,rate,months);
}
public static void compute(double amount, double rate, int months){
//amount*(rate/100.0)*(months/12.0)利息计算公式
Double rateIncome =amount*(rate/100.0)*(months/12.0);
Double totalIncome = amount + rateIncome;
System.out.println("贷款 金额"+amount);
System.out.println("贷款 月数"+months );
System.out.println("贷款年利率"+rate );
System.out.println("需偿还利息"+rateIncome );
System.out.println("本息 合计"+totalIncome );
}
}


上一讲回顾:上一讲主要讲解了Java 中变量、 API 文档、输入输出和运算符四方面基础知识。

云栖社区专家系列课——Java必修课系列其他课程:

· Java 必修课第一讲:yq.aliyun.com/articles/60…

· Java 必修课第二讲:yq.aliyun.com/articles/60…

· Java 必修课第三讲:yq.aliyun.com/articles/60…