- Java基础语法 重点
- 类型转换
- 1,基本数据类型转换(Conversion)
- 2,自动类型转换(隐式类型转换)
- 3,强制类型转换(显示类型转换)
- 4,特殊的数据类型转换
- 5、练习
- ==double与float**的区别**==
- 6,补充 :Java的基本数据类型的存储范围
- 1、整型系列
- 2、浮点型系列(小数)
- 3、单字符类型:char
- 4、布尔类型
- 运算符(Operator)
- 1,**求余数运算**
- 2,“+”号的两种用法
- 练习
- 练习:判断如下程序的运行结果
- 面试题
- 面试题
- 条件运算符
- 补充一些习题
- 判断闰年
在Java程序中,不同的基本数据类型的值经常需要进行相互转换。Java语言所提供的七种数值类型之间可以相互转换,基本数据类型转换有两种转换方式:自动类型转换和强制类型转换。
2,自动类型转换(隐式类型转换)自动转换:
- 将取值范围小的类型自动提升为取值范围大的类型 。
基本数据类型的转换规则
小结:通过上面案例我们可以得出数据类型的转换关系(取值范围从小到大),如图所示:
(1)当把存储范围小的值(常量值、变量的值、表达式计算的结果值)赋值给了存储范围大的变量时,
int i = 'A';//char自动升级为int double d = 10;//int自动升级为double byte b = 127; //右边的整数常量值必须在-128~127范围内 //byte bigB = 130;//错误,右边的整数常量值超过byte范围 long num = 1234567; //右边的整数常量值如果在int范围呢,编译和运行都可以通过,这里涉及到数据类型转换 long bigNum = 12345678912L;//右边的整数常量值如果超过int范围,必须加L,否则编译不通过
(2)当存储范围小的数据类型与存储范围大的数据类型一起混合运算时,会按照其中最大的类型运算
int i = 1; byte b = 1; double d = 1.0; double sum = i + b + d;//混合运算,升级为double
(3)当byte,short,char数据类型进行算术运算时,按照int类型处理
byte b1 = 1; byte b2 = 2; byte b3 = b1 + b2;//编译报错,b1 + b2自动升级为int char c1 = '0'; char c2 = 'A'; System.out.println(c1 + c2);//113
(4)boolean类型不参与
3,强制类型转换(显示类型转换)将1.5 赋值到int 类型变量会发生什么?产生编译失败,肯定无法赋值。
int i = 3.14; // 错误
想要赋值成功,只有通过强制类型转换,将double 类型强制转换成int 类型才能赋值。
- 强制类型转换:将取值范围大的类型强制转换成取值范围小的类型。
比较而言,自动转换是Java自动执行的,而强制转换需要我们自己手动执行。
转换格式:
数据类型 变量名 = (数据类型)被强转数据值;
(1)当把存储范围大的值(常量值、变量的值、表达式计算的结果值)赋值给了存储范围小的变量时,需要强制类型转换,提示:有风险,可能会损失精度或溢出
int i = (int)3.14;//强制类型转换,损失精度 double d = 1.2; int num = (int)d;//损失精度 int i = 200; byte b = (byte)i;//溢出
(2)boolean类型不参与
(3)当某个值想要提升数据类型时,也可以使用强制类型转换
int i = 1; int j = 2; double shang = (double)i/j;
提示:这个情况的强制类型转换是没有风险的。
4,特殊的数据类型转换1、任意数据类型的数据与String类型进行“+”运算时,结果一定是String类型
System.out.println("" + 1 + 2);//12
2、但是String类型不能通过强制类型()转换,转为其他的类型
String str = "123"; int num = (int)str;//错误的 int num = Integer.parseInt(str);//后面才能讲到,借助包装类的方法才能转5、练习
1、练习题:判断如下代码是否编译通过,如果能,结果是多少?
short s1 = 12;
short s2 = 8;
short s3 = s1 + s2; //编译报错,s1 + s2自动升级为int
不能 原因是 当byte,short,char数据类型进行算术运算时,按照int类型处理
short s1 = 12;
short s2 = 8;
short s3 = (short) (s1 + s2);
2、练习题:判断如下代码是否编译通过,如果能,结果是多少?
short s1 = 12;
short s2 = 8;
byte s3 = (byte)(s1 + s2);
// byte
// 占内存:1个字节
// 存储范围:-128~127 属于大转小
输出结果20
3、练习题:判断如下代码是否编译通过,如果能,结果是多少?
char c1 = '0';
char c2 = '1';
char c3 = c1 + c2;
不能通过 字符相加运算转变为int类型 需要转化为char 或者 int 输出 a 和 97
char c1 = '0';
char c2 = '1';
char c3 = (char)(c1 + c2);
int C3 = c1 + c2;
System.out.println(c3);
System.out.println(C3);
4、练习题:判断如下代码是否编译通过,如果能,结果是多少?
char c1 = '0';
char c2 = '1';
System.out.println(c1 + c2);
这种直接输出运算结果97 因为默认转换 为int 类型运算
5、练习题:判断如下代码是否编译通过,如果能,结果是多少?
int i = 4;
long j = 120; //因为右边120默认是int类型,int的值赋值给long类型是可以的,会自动类型转换,但是要求这个int值不能超过int的存储范围,如果超过int的存储范围必须加L.
double d = 34;
float f = 1.2;//因为右边1.2默认是double类型,double的值是不能直接赋值给float的,要么加F要么使用强制类型转换。
System.out.println(i + j + d + f);//最后是double
6、练习题:判断如下代码是否编译通过,如果能,结果是多少?
int i = 1;
int j = 2;
double d = i/j;
System.out.println(d);
输出结果 0.0
double与float的区别
由于第五题有些疑惑 原来是因为写小数默认为double类型
Java中的小数可以是double和float,默认是double,
默认小数为 double 类型,后面也可以加 D 或 d,但这纯属多此一举,如:1.0d,但因为是默认所以可以不加直接写出1.0
小数,如果要指明是float,须在后面加f ,如:1.0f
6,补充 :Java的基本数据类型的存储范围 1、整型系列(1)byte:字节类型
-
占内存:1个字节
-
存储范围:-128~127
(2)short:短整型类型
-
占内存:2个字节
-
存储范围:-32768~32767
(3)int:整型
-
占内存:4个字节
-
存储范围:-2的31次方 ~ 2的31次方-1
(4)long:整型
-
占内存:8个字节
-
存储范围:-2的63次方 ~ 2的63次方-1
2、浮点型系列(小数)注意:如果要表示某个超过int范围的常量整数它是long类型,那么需要在数字后面加L
(1)float:单精度浮点型
-
占内存:4个字节
-
精度:科学记数法的小数点后6~7位
注意:如果要表示某个常量小数是float类型,那么需要在数字后面加F或f,否则就是double类型
(2)double:双精度浮点型
-
占内存:8个字节
-
精度:科学记数法的小数点后15~16位
float f = 12.0F;//右边如果赋值小数常量值,那么必须加F或f3、单字符类型:char
- 占内存:2个字节
boolean:只能存储true或false
运算符(Operator) 1,求余数运算虽然计算机底层使用0和1表示false和true,但是在代码中不能给boolean类型的变量赋值0和1,只能赋值false和true
模运算是指取模运算,即求m/n的余数。
System.out.println(3 % 4);// 3 4乘以0再加1等于3 System.out.println(5%2);//1 2乘以2再加1等于5 System.out.println(5%-2);//1 -2乘以-2再加1等于5 System.out.println(-5%2);//-1 System.out.println(-5%-2);//-1 这个怎么有点绕 //商*除数 + 余数 = 被除数 //5%-2 ==>商是-2,余数时1 (-2)*(-2)+1 = 5 //-5%2 ==>商是-2,余数是-1 (-2)*2+(-1) = -4-1=-52,“+”号的两种用法
- 第一种:对于+两边都是数值的话,+就是加法的意思
- 第二种:对于+两边至少有一边是字符串得话,+就是拼接的意思
public class OperatorDemo02 {
public static void main(String[] args) {
// 字符串类型的变量基本使用
// 数据类型 变量名称 = 数据值;
String str1 = "Hello";
System.out.println(str1); // Hello
System.out.println("Hello" + "World"); // HelloWorld
String str2 = "Java";
// String + int --> String
System.out.println(str2 + 520); // Java520
// String + int + int
// String + int
// String
System.out.println(str2 + 5 + 20); // Java520
}
}
练习
(1)获取一个四位数的个位,十位,百位,千位
解题要点 :充分利用 / 和 %
/消除最后一位数
%求得最后一位数
public class LianXi {
public static void main(String[] args) {
//1.定义一个四位数,例如1234
int num = 1234;
//2.通过运算操作求出个位,十位,百位,千位
int ge = num%10; //直接求出最后一位4
int shi = num/10%10; //先把左后一位干掉 这时变为123 再用%求得最后一位3
int bai = num/100%10; //同理 先把左后一位干掉 这时变为12 再用%求得最后一位2
int qian = num/1000; //12 干掉2 就剩下1了
System.out.println(num + "这个四位数个位上的数字是:" + ge);
System.out.println(num + "这个四位数十位上的数字是:" + shi);
System.out.println(num + "这个四位数百位上的数字是:" + bai);
System.out.println(num + "这个四位数千位上的数字是:" + qian);
}
}
练习:判断如下程序的运行结果
public static void main(String[] args){
int a = 1;
int b = 2;
int c = 0;
boolean flag = false;
if(flag=true){
c = a++ + b;
}
if(flag=false){
c = ++a - b;
}
System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("c = " + c);
}
## 3,&&和&区别,||和|区别
- **&&和&**区别:
- &&和&结果一样,&&有短路效果,左边为false,右边不执行;&左边无论是什么,右边都会执行。
- **||和|**区别:
- ||和|结果一样,||有短路效果,左边为true,右边不执行;|左边无论是什么,右边都会执行。
注意 if语句进去了 但是不符合条件 就直接输出了
public class LogicExer1{
public static void main(String[] args){
int x = 1;
int y = 1;
//x==2 ,x++ false x = 2 左边为false
//右边继续
//++y y==2 y=2 y==2成立 右边为true
//false & true 结果false
if(x++==2 & ++y==2){
x =7;
}
System.out.println("x="+x+",y="+y);//x=2,y=2
}
}
public class LogicExer2{
public static void main(String[] args){
int x = 1,y = 1;
//x==2,x++ 左边条件为false,x=2
//因为短路与,右边不算
//false && ? 结果是false
if(x++==2 && ++y==2){
x =7;
}
System.out.println("x="+x+",y="+y);//x=2,y=1
}
}
public class LogicExer3{
public static void main(String[] args){
int x = 1,y = 1;
//x==1,x++ 左边为true,x=2
//因为是逻辑与,右边继续
//++y, y==1 y=2 右边为false
//条件true | false,最终为true
if(x++==1 | ++y==1){
x =7;
}
System.out.println("x="+x+",y="+y);//x=7,y=2
}
}
public class LogicExer4{
public static void main(String[] args){
int x = 1,y = 1;
//x==1,x++ 左边为true,x=2
//因为是短路或,左边为true,右边就不看了
//整个条件为true
if(x++==1 || ++y==1){
x =7;
}
System.out.println("x="+x+",y="+y);//x=7,y=1
}
}
面试题
class Test4_2 {
public static void main (String [] args) {
boolean x = true;
boolean y = false;
short z = 42;
//如果if(y=true)条件成立,接着判断if((z++==42)&&(y==true)) z++;
//如果不成立,if((z++==42)&&(y==true)) z++; 不看的
//标准
//y=true赋值,y就被修改为true,if(true)成立
if(y=true){
//左边:z==42,z++ 成立,z变成43
//&&短路与,不满足短路的情况,右边继续
//y==true 成立
//true && true,结果为true
if((z++==42)&&(y==true)){
//z++变成44
z++;
}
}
//左边:x=false不成立
//中间虽然是短路或,但是没满足短路的情况,右边继续
//++z,z==45 ++z变成45,z==45成立
if((x=false) || (++z==45)){
//z++,变成46
z++;
}
System. out.println("z="+z);//46
}
}
条件运算符
- 条件运算符格式:
条件表达式?结果1:结果2
- 条件运算符计算方式:
- 条件判断的结果是true,条件运算符整体结果为结果1,赋值给变量。
- 判断条件的结果是false,条件运算符整体结果为结果2,赋值给变量。
public static void main(String[] args) {
int i = (1==2 ? 100 : 200);
System.out.println(i);//200
int j = (3<=4 ? 500 : 600);
System.out.println(j);//500
}
补充一些习题
判断闰年
public class Test09 {
public static void main(String[] args) {
int year = 2018;
boolean result = year%4==0 && year%100!=0 || year%400==0;
System.out.println(year + (result ? "是闰年" : "不是闰年"));
}
}
i=0.2; 等于0*
如下代码的计算结果是:
int i = 1;
i *= 0.2;
i++;
System.out.println("i=" + i);//i=1
如下代码的运算结果是:
int i = 2;
i *= i++;
int j = 2;
j *= j+1;
int k = 2;
k *= ++k;
System.out.println("i=" + i);//i=4
System.out.println("j=" + j);//i=6
System.out.println("k=" + k);//i=6
public static void main(String[] args) {
int a = 8, b = 3;
System.out.println(a>>>b);//1
System.out.println(a>>>b | 2);//2
}
8;
boolean result = year%40 && year%100!=0 || year%4000;
System.out.println(year + (result ? “是闰年” : “不是闰年”));
}
}
**i*=0.2; 等于0**
如下代码的计算结果是:
int i = 1;
i *= 0.2;
i++;
System.out.println(“i=” + i);//i=1
```java
如下代码的运算结果是:
int i = 2;
i *= i++;
int j = 2;
j *= j+1;
int k = 2;
k *= ++k;
System.out.println("i=" + i);//i=4
System.out.println("j=" + j);//i=6
System.out.println("k=" + k);//i=6
public static void main(String[] args) {
int a = 8, b = 3;
System.out.println(a>>>b);//1
System.out.println(a>>>b | 2);//2
}



