JAVASEday03
一、这里我们说引用数据类型
大部分的引用数据类型都具有以下结构:
1、导包
告诉java当前要使用的引用数据类型的位置
import 包名.类名;
位置: 类的上面
2、构建当前引用数据类型的引用或变量
引用数据类型 变量名或引用 = new 引用数据类型();
3、使用功能
引用.功能名字();
这里我们接受Scanner: 接收键盘输入
1、导包
import java.util.Scanner;
2.构建Scanner的引用|变量
Scanner sc = new Scanner(System.in);
3、功能
// 接收用户键盘输入byte类型的数据
sc.nextByte();
//接收用户键盘输入short类型的数据
sc.nextShort();
sc.nextInt();
sc.nextLong();
sc.nextFloat();
sc.nextDouble();
//从有效字符开始接收,如果遇到空格停止接收,enter代表功能的结束
sc.next();//接收用户键盘输入String类型的数据
//以上的系列next功能不接受enter键,从有效字符开始接收
sc.nextLine();//接收用户键盘输入String类型的数据,接收一整行内容,作为String字符串类型的数据,包含空格,接收到enter结束功能
sc.close();//在当前类中使用完毕之后关闭,节省资源
注意:
如果nextLine()功能的前面存在系列next功能enter遗留问题,需要在nextLine()开启之前,通过nextLine()处理遗留问题
import java.util.Scanner;
public class ScannerDemo01{
public static void main(String[] args){
//构建Scanner的引用|变量
Scanner sc = new Scanner(System.in);
//功能
System.out.println("请输入年龄:");
int i = sc.nextInt();
System.out.println(i);
System.out.println("请输入余额:");
double d = sc.nextDouble();
System.out.println(d);
//处理enter遗留
sc.nextLine();
System.out.println("请输入用户名:");
//String s= sc.next();
String s= sc.nextLine();
System.out.println(s);
//关闭
sc.close();
}
}
二、
流程控制语句
顺序结构: 默认顺序从上到下,从左到右
选择结构: 根据条件决定是否执行一段语句
if…
switch
循环结构: 控制一段代码执行多次 (执行的次数可以有条件控制)
for
while
do…while
选择结构:
单选|单分支:
if(选择判断){
执行的语句体;
}
满足()条件就执行语句体,不满足就不执行
选择判断 : 是一个结果为boolean类型的表达式 true满足|false不满足
双选|双分支:
if(选择判断){
满足条件执行的语句体1;
}else{
不满足条件执行的语句体2;
}
根据条件的结果,决定执行那种语句体
如果结果为true,执行语句体1,结果为false执行语句体2
多选|多分支:
if(条件1){
满足条件执行的语句体1;
} else if(条件2){
不满足条件执行的语句体2;
} else if(条件3){
不满足条件执行的语句体3;
}
…
else{
以上条件都不满足就执行语句体n; --接盘侠,可以存在可以不存在
}
注意: 多选择的多个判断 从上到下一次进行,只要执行了一个对应的语句体,后面的语句体不会再次执行
一个if结构只能执行一个语句体
如果语句体中的语句只有一条,前后的{}可以省略
//if语句
public class Demo02{
public static void main(String[] args){
//单选择
System.out.println("if语句开始");
if(false){
System.out.println("if语句体中");
}
System.out.println("if语句结束");
//双选择
int i =-1;
if(i>0){
System.out.println("dayu");
}else{
System.out.println("budayu");
}
//多选择
if(i==0){
System.out.println("=0");
}else if(i>0){
System.out.println(">0");
}else if(i<0){
System.out.println("<0");
}
if(i==0)
System.out.println("=0");
else if(i>0)
System.out.println(">0");
else
System.out.println("<0");
}
}
//计数器
int count = 0; //满足条件的个数
if(height>180){
//count = count+1;
count++; //count变量的值自身+1
}
if(money>1000000){
count++;
}
if(face>90){
count++;
}
//多选择
//通过判断得到 一共满足了几个条件
if(count==3){
System.out.println("高富帅");
}else if(count==2){
System.out.println("潜力股");
}else if(count==1){
System.out.println("屌丝");
}else{
System.out.println("辣鸡!!!");
}
//这里是计数器,更加方便if语句的编写
2、switch 定值判断
switch(表达式){
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
case 值3:
语句体3;
break;
....
default:
语句体n;
break;
}
执行流程:
1.计算表达式,得到一个结果
2.从上到下与每一个case后的值进行判断是否相等,相等执行对应的语句体,不相等继续向下判断
3.break;代表结束当前switch语句结构,没有break会发生case穿透
4.如果所有的case都不满足,就执行default后面的语句体n,相当于else,可以不写
表达式: 一般为变量名,可以为表达式,可以为常量(没意义)
类型: byte,short,int,char,枚举(jdk1.5),字符串(jdk1.7)
case 穿透:
当执行完毕语句体之后如果没有break,发生case穿透,下面的case无论是否满足,都不会再判断,直接执行对应的语句体,知道遇到下一个break或者switch语句的结束而结束
default: 位置可以任意改变
switch 与 if的区别:
if: 区间判断,定值判断
switch: 定值判断
能用switch都能用if,但是能用if不一定能用switch
public class Demo04{
public static void main(String[] args){
//判断 年龄: 18~20岁之间的员工,根据年龄决定工资 18-》18万 19-》19万 20-》20万
int age = 180;
int sal = 0; //年薪
//根据年龄判定 ,决定年薪的值
switch(age){
case 18:
sal = 180000;
System.out.println("年薪的值为:"+sal);
//break;
case 19:
sal = 190000;
System.out.println("年薪的值为:"+sal);
//break;
case 20:
sal = 200000;
System.out.println("年薪的值为:"+sal);
//break;
default:
System.out.println("年龄不符合要求!!!");
}
}
三、
①算术运算符: +,-,*,/,%,++,–
+:
正号(省略)
加法运算 a+b
字符串的连接符 : 当+左右两边一旦出现字符串,+都作为字符串的连接符使用,把两边的数据最终连接成为一整个字符串
%: 求余数
3%5
规律: 当第一个操作数小于第二个操作数的时候,结果就为第一个操作数
++: 自增,自身+1
–: 自减,自身-1
只影响自己:
++放在操作数的前面还是后面,都是自身+1
–放在操作数的前面还是后面,都是自身-1
影响其他值: (++|–赋值运算,输出语句,表达式)
++或–放在操作数的前面,先自身+1或-1,然后再去参与运算(赋值,输出,计算表达式)
++或–放在操作数的后面,然后再去参与运算(赋值,输出,计算表达式),先自身+1或-1
public static void main(String[] args){
int a = 1;
int b = 2;
System.out.println(a+","+b);
//影响自己(操作数)的值
a++; //a=a+1;
++a; //a=a+1;
System.out.println(a);
--b; //b=b-1;
b--; //b=b-1;
System.out.println(b); //0
//影响别人
System.out.println(b++); //0
System.out.println(b); //1
int c = ++a + 10;
System.out.println(c); //
System.out.println(a);
}
②赋值运算符
基础赋值运算符
=
自右向左运算的符号
扩展赋值运算符
+= a+=b; --> a=a+b;
-=
*=
/=
%=
优点:
帮助自动做强制类型转换
提高执行效率,默认把优化成扩展赋值运算符的样子
推荐使用扩展赋值运算符
public static void main(String[] args){
int a = 5;
int b = 3;
//正常写法
a = a+1; //a +=1;
System.out.println(a+=b);
System.out.println(a+","+b);
System.out.println(a-=b);
System.out.println(a+","+b);
System.out.println(a*=b);
System.out.println(a+","+b);
System.out.println(a/=b);
System.out.println(a+","+b);
System.out.println(a%=b);
System.out.println(a+","+b);
a+=10;
//a+=1; a++;
System.out.println(a+","+b);
short s = 1;
s = (short)(s+1);
//帮助自动做强制类型转换
s++;
s+=1;
System.out.println(s);
}
③关系运算符或比较运算符
> < >= <= == !=
< >= <=
操作数只能为为基础数据类型的数据 byte,short,int,long,float,double,char
== != 任意类型都能判断
注意: 所有的比较运算符结果为boolean值
boolean 类型不参与类型转换
!=就是==取反
public static void main(String[] args){
int a = 7;
int b = 5;
boolean flag = a+b> 10;
System.out.println(flag);
String name = "zhangsan";
String name2 = "zhangsanfeng";
System.out.println(name==name2);
System.out.println('a'>=97);
System.out.println(true!=false);
System.out.println(true!=a>b);
}
注意: 如果以后比较字符串内容是否相等,都通过equals() 进行比较
字符串1.equals(字符串2) --> 相等true,不相等false
equals就是根据两个字符串的内容比较字符串是否相等
④逻辑运算符
两边的操作数必须值为boolean类型(值,表达式)
一般用来用来连接两个条件
& 与
两边都满足才是满足,一个为false就是false
|或
一个为true就是true,两个都为false才是false
! 取反 !true=>false !false->true
^ 异或
两边的操作数相等为false,不等为true
短路: 如果操作操作数能够决定整个结果,右边的操作数将不会执行
&&
||
注意: 逻辑运算符两边操作数结果必须为boolean
逻辑运算符最终的结果boolean类型的值
建议使用短路运算符
public static void main(String[] args){
System.out.println("----------&---------------");
System.out.println(true & false); //false
System.out.println(true & true); //true
System.out.println(false & true); //false
System.out.println(false & false); //false
System.out.println("zhangsan"!="zhangsan" & "lisi".equals("lisi")); //false
System.out.println("----------|---------------");
System.out.println(true | false); //true
System.out.println(true | true); //true
System.out.println(false | true); //true
System.out.println(false | false); //false
System.out.println("zhangsan"!="zhangsan" | "lisi".equals("lisi")); //true
System.out.println("----------!---------------");
System.out.println(!false); //true
System.out.println(!true); //false
System.out.println("----------^---------------");
System.out.println(true ^ false); //true
System.out.println(true ^ true); //false
System.out.println(false ^ true); //true
System.out.println(false ^ false); //false
System.out.println("zhangsan"!="zhangsan" | "lisi".equals("lisi")); //true
System.out.println("----------&&---------------");
System.out.println(true && false); //false
System.out.println(true && true); //true
System.out.println(false && true); //false
System.out.println(false && false); //false
System.out.println("zhangsan"!="zhangsan" & "lisi".equals("lisi")); //false
//System.out.println("zhangsan"!="zhangsan" & 5/0==0); //java.lang.ArithmeticException: / by zero
System.out.println("zhangsan"!="zhangsan" && 5/0==0); //false,因为第二个操作数不会执行,发生短路
String name = "张三";
int pwd = 1234;
//用户名与张三相等,同时必须是否为123相等,相等登录成功,不等登录失败
if(name.equals("张三") && pwd==123 ){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
}
⑤位运算符
先把操作数转为二进制,然后运算,结果转为十进制
十进制整数转为二进制:
使用十进制的整数不停的除以2,最终的结果为0的时候,从下晚上看余数
0b开头标识二进制的整数
二进制转为十进制:
从最后一位数开始,不停的通过这一位置的数据*当前进制数^0,次方每次+1,最终的和就是十进制的表现形式
& : 同一个位置的两个数,一个为0就是0,两个都为1才是1
| : 同一个位置的两个数,一个为1就是1,连个都为0才是0
^ : 同一个位置的两个数,相等为0,不等为1
以上三个运算符,当两边的操作数为boolean,最为逻辑运算符,当两边的操作数为数字,作为位运算符存在
注意: 一个数据如果对另一个数据异或两次,结果是元数据本身
(>>)右移运算符
操作数1>>操作数2 : 操作数1先转为二进制,然后对二进制的操作数1向右移动操作数2个位数,移出的数据不看,保留的数据转为十进制
规律: 变小 操作数1>>操作数2 ==> 操作数1/2^操作数2
(<< )左移运算符
操作数1<<操作数2 : 操作数1先转为二进制,然后对二进制的操作数1向左移动操作数2个位数,空位补0,保留的数据转为十进制
规律: 变大 操作数1<<操作数2 ==> 操作数1*2^操作数2
注意: 位运算符执行效率更高,如果位移比*|/效率高,所以很多源码中会常常见到
public static void main(String[] args){
System.out.println(10);
System.out.println(0b10);
System.out.println(0b1110);
System.out.println(2&3); //2
System.out.println(2|3); //3
System.out.println(2^3); //1
System.out.println(2^3);
System.out.println(14>>2); //3
System.out.println(2<<2); //8
System.out.println(14<<3); //112
}
⑥条件运算符
根据一个条件,决定最终的结果
条件? 值1 : 值2;
条件: 是一个值为boolean类型的表达式 true|false
执行流程:
1、计算条件表达式
2、如果值为true,最终的结果为值1
3、如果值为false,最终的结果为值2
条件运算符与if语句之间的区别:
1、条件运算符肯定会得到一个结果,if不一定
2、条件运算符结果只能为某一个值,if语句体可以是一个语句块
3、条件运算符对简单的条件判定效率高,毕竟是运算符, if对复杂的比较适合
public static void main(String[] args){
int a = 5;
int b = 10;
String str = a>10? "a大于10" : "a<=10";
System.out.println(str);
//求2个数中最大的数字
int result = a>b? a : b;
System.out.println(result);
System.out.println(true?"哈哈":"呵呵");
if(true){
System.out.println(123);
System.out.println(123);
System.out.println(123);
System.out.println(123);
}else{
System.out.println(111);
System.out.println(111);
System.out.println(111);
}
⑦运算符的优先级
运算符的优先级:
优先级: 优先执行谁
口诀: 单目算数位关系,逻辑三目后赋值
默认从左向右运算,()|. 优先级最高
运算符分类:
根据操作数的个数进行根类
单目: 操作数只有一个 ++ – +正号 -负号 !
双目: 操作数有2个 + - * / % > < …
三目: 条件运算符
排序:&>^>|>&&>||
public static void main(String[] args){
//&& 与 || 之间的优先级: &&优先级高于||
System.out.println(true && true || false); //true
System.out.println(true || true && false); //true
}