目录
- 数据类型排序
- 类型转换
- 自动类型转换
- 强制类型转换
- Scanner类
- 算数运算符
- 字符串拼接
- 赋值运算符
- 自增自减
- 关系运算符
- 逻辑运算符
- 短路效应
- 三元运算
- 最后
数据类型排序
前一篇文章我们了解了Java八大基本数据类型,每一个数据类型表示的数据范围是不一样的,那他们的排序是怎么样的呢?
byte:-2^7 ~ 2^7-1,即-128 ~ 127。
short:-2^15 ~2^15-1,即-32768 ~ 32767。
int:-2^31 ~ 2^31-1,即-2147483648 ~ 2147483647。
long:-2^63 ~ 2^63-1,即-9223372036854774808 ~ 9223372036854774807。
float:-3.4 * 10^38 ~ +3.4 * 10^38
double:-1.7 * 10^-308 ~ +1.7 * 10^308
char: 0 ~ 65535
所以这时候我们可以将他们进行排序
byte<short<int<long<float<double
接着我们注意到这个排序的都是有负数范围的,而char是0~65535,这个char怎么排呢?
65535大于byte和short,所以有第二种排序
char<int<long<float<double
类型转换
自动类型转换
刚刚我们知晓了各个类型的数据范围,由此接着学习类型转换。
自动类型转换:通俗的讲就是范围小的转为范围大的。(就像小狗长成大狗,这是天经地义很合理的事情,所以叫做自动类型转换)
强制类型转换
强制类型转换:就是范围大的转为范围小的,这是不合理的,所以要进行强制类型转换,不然会报错。
强制类型转换可能会造成数据的丢失
public static void main(String[] args){
double a = 3.14;
int b = (int)a;
System.out.println(b);
}
我们预期的结果是3.14
然而输出的是3,我们double数据类型的精度就丢失了。
Scanner类
Scanner类可以帮助我们进行键盘数据输入,具体过程为:
1.导入包
2.new一个scanner类
3.键盘输入数据
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个值:");
int i = scanner.nextInt();
System.out.println("你输入的值为:");
System.out.println(i);
要输入int类型就用nextInt,同理有nextDouble,nextFloat等等
八大基本数据类型中除了char,都可以像上面这样输入
那char类型应该怎么样输入呢?字符串类型String又该怎么输入呢?
答案是:
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个字符:");
String i = scanner.next();
System.out.println("你输入的值为:");
System.out.println(i);
算数运算符
算术运算符有+ - * / %
加减乘除我们都很清楚,那么%是什么意思呢?
%是取余的意思
public static void main(String[] args) {
int a = 9;
int b = a % 3;
System.out.println("b:"+b);
}
因为能整除,所以对他取余就是0
加减乘都很简单没有什么特别的,但是看一下除法
public static void main(String[] args) {
int a = 9;
int b = a / 2;
System.out.println("b:"+b);
}
我们预计的结果是4.5,但是实际输出是4
因为在除法中,两个整数相除得出的只能是整数,会自动把小数点后的部分省略
为什么整数和整数相除,一定会是整数呢?
因为Java是一种很严谨的语言,它只能识别一种数据类型。
这就涉及到表达式类型提升。
什么是表达式类型提升呢?
表达式类型提升就是:
有多种数据类型参与运算,会自动转为范围较大的数据类型。
所以整数和整数只能得整数。
如果我们一定要保留小数的话,只需要让小数参与运算即可
public static void main(String[] args) {
System.out.println(9/2);
System.out.println(9/2.0);
System.out.println(9.0/2);
System.out.println(9.0/2.0);
}
字符串拼接
任意类型+字符串都是在拼接,而不是加法
public static void main(String[] args) {
int a =10;
System.out.println("aaa"+a);
}
接着看
public static void main(String[] args) {
System.out.println("aaa"+10+10);
System.out.println(10+10+"aaa"+10+10);
}
我们的运算式都是从左往右,两个两个进行,所以第二个输出是先10+10进行加法运算,再进行字符串拼接
赋值运算符
赋值运算符包括== += -= /= %=
"=="是判断是否相等,=是进行赋值
+=是先进行+操作,再赋值
其余都是一样的操作
public static void main(String[] args) {
byte a = 1;
int b = 0;
a += b;
System.out.println(a);
}
a += b相当于先进行a + b 的操作,再把相加的结果赋值给a,也就是a = a + b
这样理解不完全正确,因为在+= -=这样之中还含有隐藏的类型转换
我们会发现这样会报错,因为byte,short,char在运算时会自动转为int类型,我们先进行a + b,得到的是一个Int类型,将int类型赋值给byte,必须强制转换。
自增自减
例如i++ 、 i-- 、++i 、–i
这些都是自增自减,那i++和++i有什么区别呢?
拿自增来举个例子,
当自增是单独运算的时候,不用考虑是先++还是先赋值,结果肯定是自增的,看代码:
public static void main(String[] args) {
int i =10;
i++;
System.out.println("i = " + i);
++i;
System.out.println("i = " + i);
}
说明当i++单独操作时,不会有特殊情况,肯定是+1的。
当i++参与运算时,就会有特殊情况,看代码:
(参与运算的意思就是除了i++,这一行还有其他的代码)
public static void main(String[] args) {
int i =10;
System.out.println(i++);
System.out.println(i);
System.out.println(++i);
}
我们尝试后发现,
i++是先输出,再进行自增
++i是先进行自增,再输出
总结通俗的结论:
i在前面,就先得i的值
++在前面,就先进行++
关系运算符
==、>=、<=、!=、>、<
返回的是一个boolean类型的值
public static void main(String[] args) {
System.out.println(7>8);
System.out.println(7<8);
System.out.println(7==8);
System.out.println(7<=8);
System.out.println(7>=8);
System.out.println(7!=8);
}
逻辑运算符
逻辑运算符包括&&(与)、||(或)、!(非)
先举个例子引出
在Java代码中要表示一个范围2 < a < 6 ,应该怎么表示呢?
我们看到直接写是会报错的,我们看一下提示,上面写的boolean和int,这是怎么回事呢?
结合前面的知识,我们是从左往右两两进行运算的,所以先执行2 < a,得到的结果是true,从而造成true < 6
public static void main(String[] args) {
int a = 5;
System.out.println(2<a && a<6);
}
这就是我们的逻辑运算符
&&(与)用来表示多个关系式同时成立
||(或)用来表示多个关系式只需一个成立即可
! (非)用来取与之前相反的情况
短路效应
public static void main(String[] args) {
int a = 5;
int b = 10;
System.out.println(a++ > 0 || b++>0);
System.out.println(a);
System.out.println(b);
}
我们先分析一下代码,回顾之前的内容,a++应该是先赋值再加加,所以a的值应该为6,那b的值又是多少呢?11吗?
运行后发现a = 6,b = 10,b并没有加加,这是为什么呢?
因为||是多种表达式中只要有一个满足条件即可,我们a++>0是成立的,为true,所以直接短路了,不执行后面的b++
三元运算
格式
关系表达式?表达式1:表达式2
若关系表达式为true,则返回表达式1
若关系表达式为flase,则返回表达式2
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(a>b?a:b);
int s = a>b?a:b;
System.out.println(s);
}