文章目录
从零开始的Java学习生活(4)
前期提要:在上一篇文章中,我们讲解了Java中常量和变量的声明以及使用方法,做到了可以轻松的在控制台上输出各种类型的语句。本文我们将深入了解一下不同变量类型之间的转换机制以及Java中常用的各种运算符。那么废话少说,开始今天的学习吧!
一、类型转换
类型转换指的是数据类型之间的相互转换。
在Java中类型转换分为:**自动类型转换和强制类型转换。**下面我们来分别看一下这两种方式。
1.自动类型转换
把一个表示数据范围小的值或变量赋值给一个表示数据范围大的变量。
例如:long a = 100;
什么意思呢?请大家回想一下我们上一篇文章中的数据范围分类图。这个时候我们就可以把一个脚下的变量或值赋值给一个数据范围大的变量。举个栗子来说就是我们有一个盛满水的小杯子,那么我们把这个杯子里的水全部倒入一个大杯子里面是完全合理的。但是反过来如果我们想把一个大杯子的水倒进小杯子里面,那么水肯定会洒出来,这样是不行的。
我们看一下上面的例子,首先声明了一个long类型的数据并且命名为"a";然后把int类型的常量100作为值赋给a,这个时候a就相当于是那个大杯子,而100就是那个小杯子里面的水,用大杯子来装绰绰有余。
2.强制类型转换
那么这个时候可能会有朋友要问了:啊,那我就是想把大范围的数据放入小数据里可以吗?
当然可以!
这个时候就要请出我们第二种数据类型转换方法了——强制类型转换。
强制类型转换的语法格式:目标数据类型变量名 = (目标数据类型)值(或变量)
eg:int a = (int)3.14;
但这样不会和我们上面举的大小杯子的例子矛盾吗?答案是否定的,大转小我们可以把它理解为一种奢侈的用法,指的就是,我知道我这个小杯子装不下我的大杯子的水,但我还是要倒进去。如果装不下了,那就让他洒出来就行了,这部分我不要了。(老板大气! )我只要把我小杯子正好装满就行了。
比如上面的例子,将double类型的常量3.14转换为int类型,就是舍弃了小数点后面的部分,我只要整数部分就可以了。
但是既然是强制转换,肯定是有风险的,毕竟强扭的瓜不甜对吧。就比如例子中,如果3.14的整数部分比较大,超出了int类型的范围,就会转换出一个错误的结果。所以,虽然Java提供了强制类型转换,但是转换有风险,如果确定转换后不会出问题,再使用强制类型转换。
二、运算符
运算符:是对常量或者变量进行操作的符号。
1.赋值运算符(=)
这个运算符将会成为我们一段时间内,甚至在整个Java学习过程中,最常用的运算符。
它的功能不多,但是都非常的重要,我们在之前也都提到过,现在把这两种功能放在一起来聊一下:
- 初始化变量。任何一个变量在用的时候都必须先定义再使用,定义的时候,必须有初始值。示例:int age = 20;
- 改变变量的值。age = 30;
使用的时候只需要注意这以下几点就可以了:"="左边必须是一个变量,右边是一个值(或者变量)。不能出现10 = a;这样的操作,这也符合常量不可更改的特性。
2.算术运算符(+、-、*、/、%)
接下来是算数运算符,大部分都是老面孔,就不用我细说了。我们先来看一下这个唯一的新人“%”;
在这里它可不是百分号的意思,它指的是取余运算,并且余数符号和被除数是一致的。
剩下需要注意的一点就是,因为int数据类型的特性,如果你用两个整数进行除法,如果结果不为整,将会直接舍弃掉小数部分,只得到商的整数部分。
再看一道小练习:
int a = 10, b = 8, c = 4;
int d = a / c + b; //d的值是多少?
int e = c * b / a; //e的值是多少?
3.复合运算符(+=、-=、*=、/=、%=)
这五个运算符其实就是相当于算数运算符和赋值运算符的结合,来看一下下面的表吧。
值得注意的一点是,在大部分的程序运行过程中,下面的两段代码都是等效的,但是因为复合运算符具有强制类型转换的功能,所以在某些时候,他们是不等价的。
//第一段代码
short a = 20;
a = a + 10;
//第二段代码
short a = 20;
a += 10;
4.自增自减运算符(++、–)
首先要说明的是,这两个运算符与之前最大的区别就是,他们只能作用于变量。
运算符 | 作用 | 说明 |
---|---|---|
++ | 自增 | 变量的值加1 |
– | 自减 | 变量的值减1 |
变量既可以放在++(或- -)的前面,也可以放在++(或–)的后面。
++在前,先自增。
++在后,后自增。
-
-在前,先自减。
-
-在后,后自减。
如果你和我一样,在学校里考过程序的选择题(不论你是c,c++,java),都会经历这个++ - - 的苦难折磨,并且你在以后的学习生活中你会发现,根本不可能会有哪个程序员会写出 ++a++这种折磨自己,折磨队友的代码,所以我们只需要记住上面四句话,并在合适的时机使用就可以啦。
还是一道小练习:
public static void main(String[] args) {
int a = 10;
int b = 10;
int c = ++a;
int d = b++;
System.out.println(c);//c是几?
System.out.println(d);//d是几?
}
5.关系运算符(==、!=、>、>、>=、<、<=)
简单来说,这几个运算符的作用就是“比大小”。
运算符 | 说明 |
---|---|
== | a==b,判断a和b的值是否相等,成立为true,不成立为false |
!= | a!=b,判断啊和b的值是否不相等,成立为true,不成立为false |
> | a > b,判断a是否大于b,成立为true,不成立为false |
>= | a>=b,判断a是否大于等于b,成立为true,不成立为false |
< | a < b,判断a是否小于b,成立为true,不成立为false |
<= | a<=b,判断a是否小于等于b,成立为true,不成立为false |
没有什么难度,看一下表记住就可以了。哦对了,注意区别 = 和==,二者是截然不同的哦(我才不会告诉你们我最开始学的时候把==写成了=找了多久的bug )。
6.逻辑运算符(&、|、!、^、&&、||)
这回终于全是新面孔了,但他们大部分只是换了件衣服罢了,很多都是我们在高中数学中学过的逻辑判断的知识。
运算符 | 作用 | 说明 |
---|---|---|
& | 逻辑与 | a&b,a和b都是true,结果为true,否则为false |
| | 逻辑或 | a|b,a和b都是false,结果为false,否则为true |
^ | 逻辑异或 | a^b,a和b结果不同,为true,结果相同为false |
! | 逻辑非 | !a,结果和a的结果相反 |
&& | 短路逻辑与 | 作用和&相同,但是有短路效果 |
|| | 短路逻辑或 | 作用和|相同,但是有短路效果 |
这里我们来说一下短路效果,先来看“&&”。它的判断方式和上面的“&”是没有区别的,都是一假则假,全真才真;在一假则假的时候,区别就出来了。如果是我们人算的话,一看到第一个是假的,你还会看第二个是不是真的吗?当然不会啊!但机器就会傻傻的继续算下去,所以有了“&&”。短路效果赋予了程序和我们一样的思维方式,加快了代码的运行速度,节省了时间。后面的“||”也是同样的道理。
7.三目运算符(? :)
好的我们来看一下最后的这个压轴运算符——三目运算符。它由“?” 和“ :”两部分组成,先看下下面的例子:
int a = 10 > 8 ? 1 : 0 ;
我们来一步步分析一下,首先看第一部分 "10 > 8 ",很明显,这是个关系表达式,后面的1,0就不用我说了。所以我们可以得到这样的一种格式:关系表达式 ? 表达式1 : 表达式2。
这个运算符的作用就是:如果关系表达式的值为true,表达式1的值将作为整个式子的值。如果为false,表达式2的值将作为整个式子的值。
ps:
表达式:运算符和常量或变量组成的式子。
例如:a+b c > d 2 * e + f x + y > z
留一个小练习:
- 通过三目运算符,求2个数的最大值
- 通过三目运算符,求3个数的最大值
8.运算符的优先级
必然的,这么多运算符肯定要有一个先后顺序的,大部分和我们数学中学到的是一样的,大家看一下就可以了。
原则:
- 一目运算符的优先级高于二目运算符、二目运算符的优先级高于三目运算符。
- 同目时, / 高于 + -, && 高于 ||*
- 可以通过加()的方式改变优先级。
总结
今天我们的学习就到这里,我们主要了解了数据类型的两种转换方式和7种不同类型的运算符,下一期我们将学习在程序运行时输入数据(这可是程序和用户进行信息交互的第一步哦!)。谢谢大家的观看,我们下一篇文章再见。