P41 2.7.7 条件运算符
条件运算符的基本格式:
x?y:z
解释:x为表达式,其值为boolean型。先对x进行处理,若x值为true,则返回值为y;若x值为false,则返回值为z。 本语句相当于一个if型的条件语句。
注意:若y,z为整数型,则需要用int限定。若为字符串类型,则需用String限定。
例如:
int a=70;
String b=a>60?“及格”:“不及格”;
int a=70;
int b=a<60?0:1;
/**
* 条件运算符
* @author Leeson
*
*/
public class TestOperator6 {
public static void main(String[] args){
int score=80;
String type=score<60?"不及格":"及格";
//相当于一个条件语句,若满足则输出冒号前半部分;不满足则输出冒号后半部分。
System.out.println(type);
if(score>60){
System.out.println("及格");
}else{
System.out.println("不及格");
}
int a=-10;
System.out.println(a>0?1:(a==0?1:9)/*a等于0吗,不等于,故返回值为9*/);
//a大于0吗,不大于,故返回值为9
}
}
P42 2.7.8 运算符优先级的问题
优先级如下表所示:
注意两点:
- 复杂的优先级问题,尽量用括号。
- 尤其注意:优先级:逻辑非 !>逻辑与 &>逻辑或 |
P43 2.8.1 自动类型转换
总的原则:小容量的数据类型可以朝着大容量的数据类型转化。
整数型<浮点型(float<double)。
整型向浮点型转化时会造成精度的损失。
详见下图:
黑色的实线表示无数据丢失的自动类型转换,而虚线表示在转换时可能会有精度的损失。
实例代码:
/**
* 测试数据类型自动转化
* @author Leeson
*
*/
public class TestTypeConvert {
public static void main(String[] args){
//数据类型转化方式:大容量 to 小容量。
//容量的比较:整数型 < float < double
int a=12;
long b=a;
float c=a;
double e=c;
//a=b; long类型不能转化为int类型:大容量不能转化为小容量。
//long f=1.23; 1.23为double类型,不能转化为long类型
float g=12345L;//long类型可以转化为float型
//特例
byte h=123;//byte类型的范围:-128 to 127
}
}
P44 2.8.2 强制类型转换
理解:非要从容量大的数据类型向容量小的数据类型转化的一种转化方式。
方法:通过在要转化的数据前面加上(int),实现强制转化。
缺点:会造成精度损失(舍弃小数点后的数)或溢出。
代码示例:
/**
* 强制类型转化
* @author Leeson
*
*/
public class TestTypeConvert2 {
public static void main(String[] args){
double a=3.99;
int b=(int)a; //值为3
char c='a';
int d=c+1;
char e=(char)d;
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
System.out.println(e);
}
}
/**
输出结果为:
3.99
3
a
98
b
*/
P45 2.8.3 基本类型转化时常见错误和问题
-
溢出问题: int类型 乘以 int 类型,得到的结果不再是int类型,此时会出现溢出。
解决方法:long化左边一个数据,然后long型乘以一个int型结果还是long型,故能输出正确结果 -
命名问题: long类型结尾用大写的L,防止与1混淆。
示例代码:
/**
* 数据类型转化出现的错误
* @author Leeson
*
*/
public class TestTypeConvertError {
public static void main(String[] args){
int money=1000000000;//10亿,int类型范围在30亿内
int years=20;//20年
int total=years*money;
System.out.println("total="+total);
//输出为负数,故出现错误。原因在于输出超出了int范围;
long total2=years*money;
System.out.println("total2="+total2);
//输出依旧错误,原因在于先计算等式右边时已经溢出,故赋值到等式左边时出现错误
//改进方法:在等式右边的计算式中先将数据long化
long total3=(long)years*money;
System.out.println("total3="+total3);
//long化左边一个数据,然后long型乘以一个int型结果还是long型,故能输出正确结果
}
}
/**
输出结果为:
total=-1474836480
total2=-1474836480
total3=20000000000
*/
P46 2.9 简单的键盘输入和输出
scanner的运用:
步骤为
- 导入语句:import java.util.Scanner;
- Scanner scanner=new Scanner(System.in);
- System.out.println(“请输入名字”);
String name=scanner.nextLine();
此处输入的是字符串类型,故用.nextLine ; 若是整数型,则用.nextInt
注意scanner的首字母大小写。步骤2为大写,步骤3为小写。
示例代码如下:
import java.util.Scanner;
/**
* 测试Scanner键入
* @author Leeson
*
*/
public class TestScanner {
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.println("请输入名字");
String name=scanner.nextLine();
System.out.println("请输入性别");
String sex=scanner.nextLine();
System.out.println("请输入年龄");
int age=scanner.nextInt(); //注意此处不是nextLine
System.out.println("***********************");
System.out.println("姓名为:"+name);
System.out.println("年龄为:"+age);
System.out.println("性别为:"+sex);
System.out.println("来到地球多少天:"+age*365);
System.out.println("************************");
}
}
输入输出为: