day03-Java学习
1)位运算符
位运算符中相关的移动符号:
<<:左移,将最高符号位舍弃掉,在右边补齐0
>>:右移符号: 如果最高符合为如果是0,在左边补齐0;最高符号位如果是1,左边补齐1
>>>:无符号右移:无论最高符号为是0还是1,始终在左边补齐0
练习:
//请用最有效的方式写出2乘以8 的结果
2 << 3 --> 2 * 2^3
class TestDemo{
public static void main(String[] args){
//左移符号有一个结论:
//将该符号左边的数据本身乘以2的移动次幂 : 3 * 2 ^2 = 3 *4 = 12
System.out.println(3 << 2) ;
//右移符号有一个结论:
//将该符号左边的数据本身除以2的移动次幂: 24 / 2^2 = 24 / 4 = 6
System.out.println(24 >> 2) ;
System.out.println(-24 >> 2) ;
System.out.println(-24 >>> 2) ; //特点:无论最高符号位是0还是1,左边都补0
//1073741818
}
}
/*
3 << 2 :将3这个数据左移动两位
计算出3对应的二进制数据:0b11
00000000 00000000 00000000 00000011 原码(同时也是反码和补码,正数)
补码:
00000000 00000000 00000000 00000011
(00)000000 00000000 00000000 0000001100 (使用补码左移动两位)
000000 00000000 00000000 0000001100:补码--->反码---原码(正数)
=12
24 >> 2 (将24右移2位)
先算出24对应的二进制:0b11000
00000000 00000000 00000000 00011000(正数:原码,反码,补码都相同)
补码
00000000 00000000 00000000 00011000
(00)00000000 00000000 00000000 000110(00) (正数:补码--反码--->原码)
0000000000 00000000 00000000 000110
结果:6
-24 >> 2
负数
(原码)
10000000 00000000 00000000 00011000
反码:
11111111 11111111 11111111 11100111
+1
-----------------------------------------------------
补码:
11111111 11111111 11111111 11101000
1111111111 11111111 11111111 111010(00) (换算移动后的补码)
补码
1111111111 11111111 11111111 111010
-1
-------------------------------------------------
反码
1111111111 11111111 11111111 111 001
原码
1000000000 00000000 00000000 000110
- 6
-24 >>> 2
-24的原,反,补
负数
(原码)
10000000 00000000 00000000 00011000
反码:
11111111 11111111 11111111 11100111
+1
-----------------------------------------------------
补码:
11111111 11111111 11111111 11101000
无符号右移
11111111 11111111 11111111 11101000
0011111111 11111111 11111111 111010(00)
0011111111 11111111 11111111 111010 (正数:补码--反码--原码)
*/
2)三元运算符
/*
二目运算符:
int a = 10 ;
int b = 20 ;
a > b
三元运算符也称为(三目运算符)
格式:
(表达式)? 执行true的结果:执行false的结果;
*/
class OperatorDemo{
public static void main(String[] args){
//定义两个变量
//需求:求两个数据的最大值
int a = 100 ;
int b = 200 ;
//定义变量
//(表达式)? 执行true的结果:执行false的结果;
int max = (a >b)? a : b ;
System.out.println("两个数据的最大值是:"+max) ;
System.out.println("-----------------------") ;
//比较两个数据是否相等
//定义两个变量
int m = 10 ;
int n = 20 ;
//boolean flag = (m==n)? true :false ;
//==:比较运算符 :结果就是true或则false
//优化:改进
boolean flag = m == n ;
System.out.println("flag:"+flag) ;
System.out.println("-----------------------") ;
//求三个数据的最大值
int x = 50 ;
int y = 30 ;
int z = 40 ;
//方式1:使用中间第三方变量进行操作 (开发中常使用:推荐方式)
//定义中间变量temp
int temp = (x > y)? x : y ;
//使用temp和z变量进行比较
int result = (temp > z)? temp : z ;
System.out.println("result:"+result) ;
System.out.println("-----------------------") ;
//方式2:直接三元运算符 一步走
int result2 = (x > y) ?((x>z)? x : z) :((y>z)? y : z) ;
//int result2 = x > y ?x>z? x : z :y>z? y : z ; // 去掉括号:阅读性差!
System.out.println("result2:"+result2) ;
}
}
3)键盘录入数据
/*
Scanner类(java.util.Scanner):文本扫描器
基本使用:
1)导包 在Java中只要不是java.lang包下的类都需要导包
位置在class上面, 格式import java.util.Scanner; (用哪个类导哪个类)
2)固定格式:创建一个文件扫描器对象
Scanner 对象名 = new Scanner(System.in) ;
3)接收数据:
int 变量名= 对象名.nextInt() ;
4)输出变量名即可!
*/
//1)导包
import java.util.Scanner ;
class ScannerTest{
public static void main(String[] args){
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//提示
System.out.println("请您输入一个数据:") ;
//接收数据:int类型数据
int a = sc.nextInt() ;
System.out.println("a:"+a) ;
//没有说明类型:都是int
}
}
4)流程控制语句
If语句
/*
Java中的流程控制语句:
三大类:
1)顺序结构语句
代码从上到下依次加载!
2)选择结构语句
if结构语句
三种格式:
if(条件表达式){
语句;
}
//开发中:if格式2使用居多
if(条件表达式){
语句1;
}else{
语句2;
}
if(条件表达式1){
语句1;
}else if(条件表达式2){
语句2;
.....
}else{
语句n+1;
}
switch结构语句
3)循环结构语句
*/
class OrderTest{ //OrderTest.class
//main()方法---->被jvm调用
public static void main(String[] args){
//在System类中有一个方法exit(int status): 参数为0,jvm正常终止
System.out.println("程序开始了....") ;
//System.exit(0) ; //终止jvm(java虚拟机)
System.out.println("I love Java") ;
System.out.println("程序结束了....") ;
}
}
/*
if语句的三种格式的第一种:
if(条件表达式){
语句;
}
执行流程:
1)首先判断条件表达式是否成立,
如果成立,true,就执行语句
否则,不会执行!
应用场景:
针对单个条件判断
*/
//导包
import java.util.Scanner ;
class IfTest{
public static void main(String[] args){
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//提示并接收
System.out.println("请您录入一个数据:") ;
int x = sc.nextInt() ;
/*
if(条件表达式){
语句;
}
*/
if(x >=5){
System.out.println("x的值大于等于5") ;
}
System.out.println("over");
}
}
注意事项:
使用If语句的注意事项:
1)有左大括号{的地方不能有分号,有分号的地方不能有左大括号{
2)if语句中如果是单个语句,{}可以省略,但是不建议!
3){}表示一个作用域,定义变量需要在{}这个作用域范围内使用
class IfTest{
public static void main(String[] args){
//定义一个变量
int a = 10 ;
/*
if(a >=10){
System.out.println("a大于等于10") ;
}
*/
//错误写法
if(a <10);//if语句没有意义:if没有语句体,分号表示一个语句结束
//代码块:局部代码块 :限定变量的生命周期!
{
int x = 10 ;
System.out.println(x) ;
System.out.println("a大于等于10") ;
}
//System.out.println(x) ; //访问x变量超出了它的作用域范围
System.out.println("程序结束了...") ;
System.out.println("--------------------------") ;
int m = 5 ;
if(m>=5) //可以省略{},不建议
System.out.println("大于等于5") ;
}
}
/*
if语句的格式2:
if(条件表达式){
语句1;
}else{
语句2;
}
执行流程:
1)判断条件表达式是否成立,如果成立,执行语句1
2)如果不成立,执行语句2;
应用场景:
针对两种情况进行判断!
//键盘录入两个数据,比较两个数据中的最大值
//键盘录入一个数据,判断这个数据是否是偶数?
三元运算符和if格式2的区别?
三元运算符连接的是两个数据的数据值(针对这个是数据值进行比较或者判断)
if格式2是一种流程控制语句:
范围要比三元运算符大,不仅仅可以判断两个数据数据值还可以操作具体语句
能够使用if格式2实现的不一定能够使用三元运算符;
但是如果能够三元运算符实现的一定能够使用if格式2
(在开发中,针对业务逻辑判断还是使用if格式2)
*/
//导包
import java.util.Scanner;
class IfTest{
public static void main(String[] args){
//定义两个变量
int a = 10 ;
int b = 20 ;
if(a>b){ //true
System.out.println("a大于b") ;
}else{//false
System.out.println("a小于等于b") ;
}
System.out.println("over") ;
System.out.println("-----------------") ;
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//提示并接收
System.out.println("请输入第一个数据:") ;
int firstNum = sc.nextInt() ;
System.out.println("请输入第二个数据:") ;
int secondNum = sc.nextInt() ;
//方式1:可以直接if格式2
//定义变量
int max ;
if(firstNum>secondNum){
max = firstNum ;
}else{
max = secondNum;
}
System.out.println("max:"+max);
//方式2:使用三元运算符
int max2 = (firstNum > secondNum)? firstNum :secondNum ;
System.out.println("max2:"+max2);
System.out.println("-----------------") ;
//提示并接收
System.out.println("请输入一个数据:") ;
int x = sc.nextInt() ;
//使用if格式2
if(x % 2 == 0){//% :模 求余
System.out.println("该数据是一个偶数") ;
}else{
System.out.println("该数据是一个奇数") ;
}
//三元运算符:
//String s = (x % 2 == 0) ? (System.out.println("该数据是一个偶数");): (System.out.println("该数据是一个奇数");) ;
//System.out.println(s) ;
}
}
/*
if格式3:
if(条件表达式1){
语句1;
}else if(条件表达式2){
语句2;
...
...
}else{
语句n+1;
}
执行流程:
1)先判断条件表达式1是否成立,如果成立,执行语句1;
2)如果条件表达式1不成立,继续判断条件表达式2是否成立,如果成立,执行语句2
3)如果条件表达式2不成立,依次这样判断...
4)如果以上条件都不成立,执行esle中语句n+1;
*/
/*
需求:键盘录入一个成绩(0-100分),
然后判断学生是"优秀","较好","一般","及格","不及格"
90~100 优秀
80~90 较好
70~80 一般
60~70 及格
60以下 不及格
需求
1.
x和y的关系满足如下:
x>=3, y = 2x + 1;
-1<=x<3, y = 2x;
x<=-1, y = 2x – 1;
键盘录入x的值,求y的值;
2.:键盘录入一个月份的值:
判断是什么季节
3,4,5 春季
6,7,8 夏季
9,10,11 秋季
12,1,2 冬季
*/
//导包
import java.util.Scanner ;
class IfDemo4{
public static void main(String[] args){
//创建键盘录入对象
Scanner scanner = new Scanner(System.in) ;
//提示并接收数据
System.out.println("请您输入一个学生成绩:") ;
int score = scanner.nextInt() ;
/*
if(score>=90 && score<=100){
System.out.println("该学生成绩优秀") ;
}else if(score>=80 && score<90){
System.out.println("该学生成绩较好") ;
}else if(score>=70 && score<80){
System.out.println("该学生成绩一般") ;
}else if(score >= 60 && score <70){
System.out.println("该学生成绩及格") ;
}else{
System.out.println("不及格!!") ;
}
*/
//这个程序写完了,存在漏洞:当前用户输入一个非法数据,没有友情提示(用户体验不好)
//测试的时候:针对错误数据测试,还有测试正确数据,在边界数据!
if(score>100 || score < 0){
System.out.println("您输入的数据是一个非法数据...") ;
}else if(score>=90 && score<=100){
System.out.println("优秀...") ;
}else if(score >=80 && score<90){
System.out.println("较好...") ;
}else if(score>=70 && score<80){
System.out.println("一般...") ;
}else if(score >= 60 && score <70){
System.out.println("刚及格...") ;
}else{
System.out.println("不及格...") ;
}
}
}
练习1:
x和y的关系满足如下:
x>=3, y = 2x + 1;
-1<=x<3, y = 2x;
x<=-1, y = 2x – 1;
键盘录入x的值,求y的值;
//导包
import java.util.Scanner ;
class IfTest{
public static void main(String[] args){
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//提示并接收
System.out.println("请您输入x的值:");
int x = sc.nextInt() ;
//定义y变量
int y = 0 ;
if(x>=3){
y = 2*x+1;
}else if(x >=-1 && x <3){
y = 2 * x ;
}else{
y = 2*x - 1;
}
System.out.println("y的值是:"+y) ;
System.out.println("-------------------------") ;
练习2:
键盘录入一个月份的值:
判断是什么季节
3,4,5 春季
6,7,8 夏季
9,10,11 秋季
12,1,2 冬季
import java.util.Scanner;
class IfTest1{
public static void main(String[] args){
//提示并接收数据
System.out.println("请您输入一个月份的值:") ;
int month = sc.nextInt() ;
if(month > 12 || month < 1){
System.out.println("地球没有该月份...") ;
}else if(month >= 3 && month <= 5){
System.out.println("春季") ;
}else if(month >= 6 && month <= 8){
System.out.println("夏季") ;
}else if(month >= 9 && month <= 11){
System.out.println("秋季") ;
}else{
System.out.println("冬季") ;
}
}
}
/*
if格式2的嵌套
if(条件表达式1){
if(条件表达式2){
}else{
}
}else{
if(条件表达式3){
}else{
}
}
练习3:
键盘录入三个数据,获取最大值
import java.util.Scanner;
class IfTest2{
public static void main(String[] args){
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//提示并录入
System.out.println("请输入第一个数据:") ;
int a = sc.nextInt() ;
System.out.println("请输入第二个数据:") ;
int b = sc.nextInt() ;
System.out.println("请输入第三个数据:") ;
int c = sc.nextInt() ;
//之前的写法:中间第三方变量 + 三元运算符
int temp = (a>b)? a: b ;
int max = (temp > c)? temp : c ;
System.out.println("max:"+max) ;
System.out.println("-----------------------") ;
//if格式嵌套;
int max2 ;
if(a>b){
if(a>c){
max2 = a ;
}else{
max2 = c ;
}
}else{
if(b>c){
max2 = b ;
}else{
max2 = c ;
}
}
System.out.println("max2:"+max2) ;
}
}
switch语句
/*
switch 选择结构语句
格式:
switch(表达式){
case 值1:
语句1;
break ;
case 值2:
语句2;
break ;
...
...
default:
语句n+1;
break ;
}
执行流程:
1)switch后面的表达式需要和case语句中的值进行匹配
如果值1匹配了,就执行语句1,遇见break 结束switch语句;
如果值1不匹配,就看值2是否匹配,如果匹配,执行语句2,遇见break结束;
…
如果上面都不匹配,执行default中的语句n+1,break结束语句;
break ; 属于跳转控制语句中一种: “结束,中断” ,
应用场景:是在switch以及loop(循环语句中使用)
面试题:
switch后面表达式可以是什么样的数据类型?
一般情况:可以byte,short,char,int类型的
JDK5以后,是可以跟枚举 (enum)类型的 (引用类型)
JDK7以后,是可以跟String类型的(引用类型)
练习1:
键盘录入一个数据,判断星期几
1,星期一
2,星期二
…
//导包
import java.util.Scanner;
class SwitchDemo{
public static void main(String[] args){
//break ; //单独使用不了; 在 switch 或 loop 外部中断
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//提示并接收
System.out.println("请您输入一个数据(1-7):") ;
int week = sc.nextInt() ;
switch(week){
case 1 :
System.out.println("星期一") ;
break ;
case 2:
System.out.println("星期二") ;
break ;
case 3:
System.out.println("星期三") ;
break ;
case 4:
System.out.println("星期四") ;
break ;
case 5:
System.out.println("星期五") ;
break ;
case 6:
System.out.println("星期六") ;
break ;
case 7:
System.out.println("星期日") ;
break ;
default:
System.out.println("数据不合法...") ;
break ;
}
}
}
重点:
/*
switch语句使用的注意事项:
1)default语句是可以放在语句中的任何位置,不影响执行流程!
(建议default语句使用的时候放在语句末尾)
如果放在语句中,最好带上break,否则会造成case穿透!
2)switch语句的结束条件:
遇见break结束或者程序默认执行到末尾!
3)case语句后面的值只能是常量,不能变量(Java是一种强类型语言)
javascript:前端,简称js,弱类型语言 (switch语句的case后面既可以是常量也可以变量)
*/
import java.util.Scanner;
class SwitchDemo2{
public static void main(String[] args){
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//提示并接收
System.out.println("请您输入一个数据(1-7):") ;
int week = sc.nextInt() ;
int b = 3 ;
switch(week){
default:
System.out.println("数据不合法...") ;
//break ;
case 1 :
System.out.println("星期一") ;
//break ;
case 2:
System.out.println("星期二") ;
break ;
//case b: //需要常量表达式 :错误的写法
case 3:
System.out.println("星期三") ;
break ;
case 4:
System.out.println("星期四") ;
//break ;
case 5:
System.out.println("星期五") ;
//break ;
case 6:
System.out.println("星期六") ;
//break ;
case 7:
System.out.println("星期日") ;
//break ;
}
}
}
键盘录入:
小细节:
先录入整数,在录入字符串类型,会出现字符串数据漏掉了
原因就是回车符号的问题
(录入完整数,按"回车符号",将回车当做了字符串录入,所以后面字符串被漏掉了)
解决方案:
在录入字符串的时候,重新创建一个键盘录入对象
//导包
import java.util.Scanner;
class SwitchTest{
public static void main(String[] args){
//录入一个整数类型,在录入字符串类型(String)
Scanner sc = new Scanner(System.in) ;
//接收整数
int a = sc.nextInt() ;
//录入字符串
//此时:创建一个新的键盘录入对象
Scanner sc2 = new Scanner(System.in) ;
String b = sc2.nextLine() ; //正式的录入字符串:nextLine()
System.out.println("a:"+a+",b:"+b);
}
}
练习2:
//看程序,写结果
class SwitchTest{
public static void main(String[] args){
//int x = 2 ;
//int y = 3 ;
/*
switch(x){
default: //当前case后面的值都和switch中的表达式不匹配,才执行default语句;
y++ ;
case 2 :
y ++ ; //3+1=4 //遇见break,程序默认执行到末尾
case 4:
y ++ ; //4+1 = 5
}
*/
int x = 2 ;
int y = 3 ;
switch(x){
default: //当前case后面的值都和switch中的表达式不匹配,才执行default语句;
y++ ; //3+1 = 4 ;
case 3 :
y ++ ; //4+1 = 5
break ;
case 4:
y ++ ; //5+1
}
System.out.println("y:"+y);
int a = 2 ;
int b = 3 ;
switch(a){
default:
b ++ ;
break ;
case 2:
b++;
case 3:
b++;
}
System.out.println("b:"+b); //5
}
}
练习3:
/*
需求:
使用switch语句模拟一个单项选择题:
'A','B','C','D'
分析:
0)模拟
你喜欢的明星是谁?
"65 高圆圆"
...
1)'A'----->对应ASCII码表的值:65
'B' 66
'C' 67
'D' 68
2)使用键盘录入一个字符(Scanner不能录入字符的),但是可以录入int类型数据 录入字符串:String nextLine()
然后将int类型强制转换成char类型
3)switch(转换char类型数){
case 'A':
语句;
break;
...
}
*/
//导包
import java.util.Scanner;
class SwitchTest2{
public static void main(String[] args){
//提供几个选项
System.out.println("您喜欢什么饮料?") ;
System.out.println("65 可乐") ;
System.out.println("66 雪碧") ;
System.out.println("67 冰峰") ;
System.out.println("68 水") ;
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//提示并接收
System.out.println("选择您的答案:") ;
int choice = sc.nextInt() ;
//String str = sc.nextLine() ;(推荐这个方式录入字符串) String str = sc.next() ;
//将int类型强制char类型
char choiceNumber = (char)choice;
switch(choiceNumber){
case 'A':
System.out.println("您选择的答案正确!") ;
break ;
case 'B':
System.out.println("您选择的答案错误!") ;
break ;
case 'C':
System.out.println("您选择的答案错误!") ;
break ;
case 'D':
System.out.println("您选择的答案错误!") ;
break ;
}
}
}