Java第三天
算术运算符的使用(ArithmeticOperator.java)
-
+,-,*,/,%,++,–
public class ArithmeticOperator{ public static void main(String[] args){ System.out.println(10 / 4);//2 System.out.println(10.0 / 4);//2.5 double d = 10/4; System.out.println(d);//2.0 //取模的本质 a % b = a - a/b * b //当a % b的a是小数时,公式为 a % b = a - (int)a/b * b System.out.println(10 % 3);//1 System.out.println(-10 % 3);//-1 System.out.println(10 % -3);//1 System.out.println(-10 % -3);//-1 } }
-
自增:++
作为独立的语句使用:
++i和i++都完全等价于i = i + 1;
作为表达式使用:
前++:++i先自增后赋值
后++:i++先赋值后自增public class ArithmeticOperatorExercise01{ public static void main(String[] args){ int i = 1; i = i++;//规则使用临时变量:(1) temp = i;(2) i = i+1;(3)i = temp; System.out.println(i);//1 int i = 1; i = ++i;//规则使用临时变量:(1) i = i+1;(2) temp = i;(3)i = temp; System.out.println(i);//2 } }
关系运算符的使用(RelationalOperator.java)
public class RelationalOperator{
public static void main(String[] args){
int a = 9;
int b = 8;
System.out.println(a > b);//T
System.out.println(a >= b);//T
System.out.println(a <= b);//F
System.out.println(a < b);//F
System.out.println(a == b);//F
System.out.println(a != b);//T
boolean flag = a > b;//T
System.out.println("flag = " + flag);
}
}
逻辑运算符
- 短路与&&,短路或||,取反(非)!
- 逻辑与&,逻辑或|,逻辑异或^
文字概述:
- a&b:&叫逻辑与:规则:当a和b同时为true,则结果为true,否则为false
- a&&b:&&叫短路与:规则:当a和b同时为true,则结果为true,否则为false
- a|b:|叫逻辑或:规则:当a和b有一个为true,则结果为true,否则为false
- a&b:||叫短路或:规则:当a和b有一个为true,则结果为true,否则为false
- !b:!叫取反:规则:当a为true,则结果为false,当a为false,结果为true
- ab:叫逻辑异或:规则:当a和b不同时,则结果为true,否则为false
&&和&的使用和区别(LogicOperator01.java)
public class LogicOperator01{
public static void main(String[] args){
int age = 50;
if(age > 20 && age < 90){
System.out.println("ok1");
}
if(age > 20 & age < 90){
System.out.println("ok2");
}
}
}
区别:
- **&&短路与:**如果第一个条件为false,则第二个条件不会判断,最终结果为false,效率高
- **&逻辑与:**不管第一个条件是否为false,第二个条件都要判断,效率低
- 开发中,我们使用的基本是短语与&&,效率高
int a = 4;
int b = 9;
if(a < 1 && ++b < 50){
System.out.println("ok3");
}
System.out.println("b = " + b);//b = 9
int a = 4;
int b = 9;
if(a < 1 & ++b < 50){
System.out.println("ok4");
}
System.out.println("b = " + b);//b = 10
||和|的使用和区别和 &&、&类似
赋值运算符
赋值运算符就是将某个运算后的值,赋给指定的变量
赋值运算符分为 基本赋值运算符 和 复合赋值运算符
复合赋值运算符:
+=,-=,*=,/=,%=等
注意:
-
运算顺序从右往左 int num = a + b + c;
这句话的意思是先计算a+b+c再进行赋值给num,a+b+c的计算还是遵循数学的计算规则 -
赋值运算符的左边 只能是变量,右边可以是变量,表达式,常量值
int num = 20;int num2 = 78*34 - 10;int num3 = a; -
复合赋值运算符等价于下面的效果,比如:
a += 3; 等价于 a = a + 3; -
复合赋值运算符会进行类型转换(AssignOperator.java)。
public class AssignOperator{ public static void main(String[] args){ byte b = 3; b += 2;//等价于 b = (byte)(b + 2); } }
三元运算符
基本语法
条件表达式 ? 表达式1:表达式2;
运算规则
- 如果条件表达式为true,运算后的结果是表达式1;
- 如果条件表达式为false,运算后的结果是表达式2;
public class TernaryOperator{
public static void main(String[] args){
int a = 10;
int b = 99;
//1.a > b 为false
//2.返回 b--,先返回b的值,然后再运算
//3.返回结果是99
int result = a > b ? a++ : b--;//99
System.out.println("result = "+result);
}
}
使用细节(TernaryOperatorDetail.java)
-
表达式1和表达式2要为可以赋给接收变量的类型(或可以自动转换)
public class TernaryOperatorDetail{ public static void main(String[] args){ int a = 3; int b = 8; int c = a > b ? (int)1.1 : (int)3.4;//ok //int c = a > b ? 1.1 : 3.4;//错误,1.1和3.4是double类型 double d = a > b ? 1.1 : 3.4;//ok } }
-
三元运算符可以转成if – else语句
运算符优先级
- . () {} ; ,
- 弹幕运算符 ++ – ~ !{data type}
- 算术运算符 * / % + -
- 位移运算符 << >> >>>
- 比较运算符 < > <= >= instanceof
- 逻辑运算符 == != & ^ | && ||
- 三元运算符 ? :
- 赋值运算符 = *= /= %= += -= <<= >>= >>>= &= ^= |=
标识符的命名规则和规范
标识符概念
- Java对各种变量、方法和类等命名时使用的字符序列称为标识符
- 凡是自己可以起名字的地方都叫标识符
标识符的命名规则
- 由26个英文字母大小写,0-9,_或$组成
- 数字不可以开头
- 不可以使用关键字和保留字,但能包含关键字和保留字
- Java中严格区分大小写,长度无限制。
- 标识符不难包含空格
标识符命名规范
- 包名:多单词组成时所有字母都小写:aaa.bbb.ccc
- 类名,接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz[大驼峰]
比如:TankShotGame - 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz[小驼峰,简称 驼峰法]
比如:tankShotGame - 常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ
比如:定义一个所得税率 TAX_RATE
键盘输入语句
在编程中,需要接受用户输入的数据,就可以使用键盘输入语句来获取。需要一个扫描器(对象),就是Scanner
步骤:
- 导入该类的所在包,java.util.xxx
- 创建该类对象(声明变量)
- 调用里面的功能
import java.util.Scanner;//表示把java.util下的Scanner类导入
public class Input{
public static void main(String[] args){
//Scanner类表示 简单文本扫描器,在java.util包
//1.引入/导入 Scanner类所在的包
//2.创建 Scanner 对象 ,new创建一个对象
Scanner myScanner = new Scanner(System.in);
//3.接受用户的输入,使用相关的方法
System.out.println("请输入名字");
String name = myScanner.next();//接收用户输入的字符串
System.out.println("请输入年龄");
int age = myScanner.nextInt();//接受用户输入的int
System.out.println("请输入薪水");
double money = myScanner.nextDouble();//接受用户输入的double
System.out.println("人的信息如下:");
System.out.println("名字:" + name + "年龄:" + age + "薪水:" + money);
}
}
进制
对于整数,有四种表示方式:
- 二进制:0,1,满2进1,以0b或者0B开头
- 八进制:0-7,满8进1,以数字0开头表示
- 十进制:0-9,满10进1
- 十六进制:0-9及A(10)-F(15),满16进1,以0x或者0X开头表示。A-F不区分大小写
int n1 = 0b1010;
int n2 = 01010;
int n3 = 1010;
int n4 = 0x1010;
System.out.println("n1 = "+ n1);//10
System.out.println("n2 = "+ n2);//520
System.out.println("n3 = "+ n3);//1010
System.out.println("n4 = "+ n4);//4112
进制转换
- 二进制转十进制:
规则:从最低位(右边)开始,奖每个位上的数提取出来,乘以2的(位数-1)次方,然后求和
例子:0b1011 = 1*2^0 + 1*2^1 + 0*2^2 + 1*2^3 = 1 + 2 + 0 + 8 = 11 - 八进制转十进制:
规则:从最低位(右边)开始,奖每个位上的数提取出来,乘以8的(位数-1)次方,然后求和
例子:0234 = 4*8^0 + 3*8^1 + 2*8^2 = 4 + 24 + 128 = 156 - 十六进制转十进制:
规则:从最低位(右边)开始,奖每个位上的数提取出来,乘以16的(位数-1)次方,然后求和
例子:0x23A = 10*16^0 + 3*16^1 + 2*16^2 = 10 + 48 + 512 = 570 - 十进制转换成二进制
规则:将该数不断除以2,直到商为0未知,然后将每步得到的余数倒过来,就是对应的二进制
例子:
34:34%2 = 0 17%2 = 1 8%2 = 0 4%2 = 0 2%2 = 0 1%2 = 1
所以十进制的34对应二进制的0010 0010 - 十进制转换成八进制
规则:将该数不断除以8,直到商为0未知,然后将每步得到的余数倒过来,就是对应的八进制
例子:
131:131%8 = 3 16%8 = 0 2%8 = 2
所以十进制的131对应八进制的203 - 十进制转换成十六进制
规则:将该数不断除以16,直到商为0为止,然后将每步得到的余数倒过来,就是对应的十六进制
例子:
237:**237%16 = 13(D) 14%16 = 14(E) **
所以十进制的237对应十六进制的ED - 二进制转成八进制
规则:从低位开始,将二进制数每三位一组,转成对应的八进制即可
例子:
0b11(3)010(2)101(5) => 0325 - 二进制转成十六进制
规则:从低位开始,将二进制数每四位一组,转成对应的十六进制即可
例子:
0b1101(D)0101(5) =>0xD5 - 八进制转成二进制
规则:将八进制的每一位转成对应一个3位的二进制数即可
例子:
02(010)3(011)7(111) => 0b10011111 - 十六进制转成二进制
规则:将十六进制的每一位转成对应一个4位的二进制数即可
例子:
0x2(0010)3(0011)B(1011) => 0b001000111011
原码、反码、补码
对于有符号的而言:
- 二进制的最高位是符号位:0表示正数,1表示负数
- 正数的原码、反码、补码都一样
- 负数的反码 = 它的原码符号位不变,其它位取反
- 负数的补码 = 它的反码+1 负数的反码 = 负数的补码 - 1
- 0的反码、补码都是0
- java没有无符号数,换而言之,java中的数都是由符号的
- 在计算机运算的时候,都是以补码的方式来运算的
- 当我们看运算结果的时候,要看它的原码
位运算符
java中由7个位运算符(&、|、^、~、>>、<<和>>>)
分别是按位与&、按位或|、按位异或^、按位取反~
运算规则:
按位与& : 俩位全为1,结果为1,否则为0
例子:0b10010001 & 0b11110010 = 0b10010000
按位非| : 俩位由一个为1,结果为1,否则为0
例子:0b10010001 | 0b11110010 = 0b11110011
按位异或^ : 俩位一个为0,一个为1,结果为1,否则为0
例子:0b10010001&0b11110010 = 0b01100011
按位取反~ : 0 -> 1 , 1 -> 0
例子 ~0b10010001 = 0b01101110
运算试题
public class aaa{
public static void main(String[] args) {
//2&3
//1.先得到2的补码 => 2的原码00000000 00000000 00000000 00000010
// 2的补码 = 2的原码 = 00000000 00000000 00000000 00000010
//2.3的补码 = 3的原码 = 00000000 00000000 00000000 00000011
//3.按位与&
// 00000000 00000000 00000000 00000010
// 00000000 00000000 00000000 00000011
// 00000000 00000000 00000000 00000010 &运算后的补码
// 运算后的原码也是00000000 00000000 00000000 00000010
// 结果就是 2
System.out.println(2&3);//2
//1. 先得到 -2的原码 10000000 00000000 00000000 00000010
//2. 再得到 -2的反码 11111111 11111111 11111111 11111101
//3. 再得到 -2的补码 11111111 11111111 11111111 11111110
//4. ~-2操作 00000000 00000000 00000000 00000001 运算后的补码
//5. 运算后的原码 00000000 00000000 00000000 00000001 => 1
System.out.println(~-2);//1
//1.先得到 2的原码 00000000 00000000 00000000 00000010
//2.再得到 2的补码 00000000 00000000 00000000 00000010
//3.~2操作 11111111 11111111 11111111 11111101 运算后的补码
//4.运算后的反码 11111111 11111111 11111111 11111100
//5.运算后的原码 10000000 00000000 00000000 00000011 => -3
System.out.println(~2);//-3
//1.先得到 2的原码 00000000 00000000 00000000 00000010
//2.再得到 2的补码 00000000 00000000 00000000 00000010
//3.在得到 3的原码 00000000 00000000 00000000 00000011
//4.在得到 3的补码 00000000 00000000 00000000 00000011
//5.操作2|3 00000000 00000000 00000000 00000010
// 00000000 00000000 00000000 00000011
//在得到 00000000 00000000 00000000 00000011 运算后的补码
//所以运算后的原码是 00000000 00000000 00000000 00000011 =>3
System.out.println(2|3);//3
//1.先得到 2的原码 00000000 00000000 00000000 00000010
//2.再得到 2的补码 00000000 00000000 00000000 00000010
//3.在得到 3的原码 00000000 00000000 00000000 00000011
//4.在得到 3的补码 00000000 00000000 00000000 00000011
//5.操作2^3 00000000 00000000 00000000 00000010
// 00000000 00000000 00000000 00000011
//在得到 00000000 00000000 00000000 00000001 运算后的补码
//所以运算后的原码是 00000000 00000000 00000000 00000001 =>1
System.out.println(2^3);//1
}
}
关于>>、<<和>>>的运算规则:
- 算术右移 >>:低位溢出,符号位不变,并用符号位补溢出的高位
- 算术左移 <<:符号位不变,低位补0
- >>>逻辑右移也叫无符号右移,运算规则是:低位溢出,高位补0
- 特别说明:没有<<<符号
应用案例(BitOperator02.java)
public class BitOperator02{
public static void main(String[] args) {
int a = 1 >> 2;
//1 => 00000000 00000000 00000000 00000001
// => 00000000 00000000 00000000 00000000
//本质1 / 2 / 2 = 0
int c = 1 << 2;
// 1 => 00000000 00000000 00000000 00000001
// => 00000000 00000000 00000000 00000100
//本质1 * 2 * 2 = 4
System.out.println(1 >> 2);//0
System.out.println(1 << 2);//4
System.out.println(4 << 3);//4 * 2 * 2 * 2 = 32
System.out.println(15 >> 2);//15 / 2 / 2 = 3
}
}
程序控制结构
顺序控制
程序从上到下逐行地执行,中间没有人和判断和跳转
分支控制if-else
-
单分支
基本语法
if(条件表达式){
执行代码块;
}
当条件表达式为true时,就会执行{}的代码。如果为false就不执行 -
双分支
if(条件表达式){
执行代码块1;
}else{
执行代码块2;
}当条件表达式为true时,就会执行代码块1,如果为false就执行代码块2
public class IfExercise01{ public static void main(String[] args) { double d1 = 12.5; double d2 = 15.3; if(d1 > 10.0 && d2 < 20.0){ System.out.println(d1 + d2); } int a = 15; int b = 15; if((a+b) % 3 == 0 && (a+b) % 5 == 0){ System.out.println("yes"); }else{ System.out.println("no"); } int years = 2000; if((years % 4 == 0 && years % 100 != 0) || years % 400 == 0){ System.out.println("是闰年"); }else{ System.out.println("不是闰年"); } } }
-
多分支
if(条件表达式1){
执行代码块1;
}else if(条件表达式2){
执行代码块2;
}…
else{
执行代码块n;
}当条件表达式1为true时,就会执行代码块1,如果为false就会看条件表达式2,如果为true,则执行代码块2,以此类推…如果条件表达式都为false,则输出代码块n
特别说明:- 多分支可以没有else,如果所有条件表达式都不成立,则一个执行入口都没有
- 多分支控制最多只能有一个执行入口
嵌套分支
在一个分支结构中又完整的嵌套了另一个完整的分支结构,里面的分支的结构成为内层分支,外面的分支结构称为外层分支
嵌套分支不要超过3层(可读性不好)
基本语法
if(){
if(){
//if-else…
}else{
//if-else
}
}
import java.util.Scanner;
public class Nestedlf{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入该歌手的成绩:");
double score = scanner.nextDouble();
if(score > 8.0){
System.out.print("请输入该歌手的性别:");
char gender = scanner.next().charAt(0);
if(gender == '男'){
System.out.println("你成功进入男子决赛");
}else if(gender == '女'){
System.out.print("你成功进入女子决赛");
}else{
System.out.print("你成功进入无性别组决赛");
}
}else{
System.out.print("你没有进入决赛");
}
}
}