Java基础语法
Scanner用法
1. 什么是Scanner
Java已经写好了一个类,叫做Scanner,用于获取用户的输入的内容。
因为是Java已经写好了,我们直接拿过来用就可以了。
2. 使用步骤
1、导包。导包的语句需要定义在类的上面。
相当于告诉虚拟机Scanner类在哪里
import java.util.Scanner;
2、创建Scanner对象。
相当于给虚拟机打个招呼,我要用这个类了。
Scanner sc = new Scanner(System.in);// 创建Scanner对象,sc表示变量名,其他均不可变
3、接收数据
才是真正干活的代码。
int i = sc.nextInt();//可以接收整数
String s = sc.next();//可以接收字符串
代码示例:
//第一步:导包
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
//第二步:创建对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数:");
//第三步:接收数据
int age = sc.nextInt();
System.out.println(age);
System.out.println("请输入一个字符串:");
//第三步:接收数据
String name = sc.next();
System.out.println(name);
}
}
运算符
概念
对常量或者变量进行操作的符号。
表达式
用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式。
不同运算符连接的表达式体现的是不同类型的表达式。
举例说明:
int a = 10;
int b = 20;
int c = a + b;
+:是运算符,并且是算术运算符。
a + b:是表达式,由于+是算术运算符,所以这个表达式叫算术表达式。
算术运算符
1.分类
案例
2.数值拆分
public class Test1Operator {
public static void main(String[] args) {
// 1:使用Scanner键盘录入一个三位数
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个三位数:");
int num = sc.nextInt();
// 2:个位的计算:数值 % 10
int ge = num % 10;
// 3:十位的计算:数值 / 10 % 10
int shi = num / 10 % 10;
// 4:百位的计算:数值 / 10 /10 % 10
int bai = num / 10 / 10 % 10;
//输出结果
System.out.println(ge);
System.out.println(shi);
System.out.println(bai);
}
}
3.字符串的拼接
- 当“+”操作中出现字符串时,这个”+”是字符串连接符,而不是算术运算。
public class Test {
public static void main(String[] args) {
System.out.println(1 + 23);
System.out.println("年龄为:" + 23);
System.out.println(1 + 99 + "年黑马");
}
}
- 可以使用小括号来改变运算的优先级
public class Test {
public static void main(String[] args) {
System.out.println("年龄为:" + (23 + 1) );
}
}
- 字符串跟变量想加的时侯,实际上会跟变量里面的内容进行拼接
import java.util.Scanner;
public class Test1Operator {
public static void main(String[] args) {
// 1:使用Scanner键盘录入一个三位数
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个三位数:");
int num = sc.nextInt();
// 2:个位的计算:数值 % 10
int ge = num % 10;
// 3:十位的计算:数值 / 10 % 10
int shi = num / 10 % 10;
// 4:百位的计算:数值 / 10 /10 % 10
int bai = num / 10 / 10 % 10;
// 目标: 整数123的个位是: 3
System.out.println("整数" + num + "的个位是:" + ge);
System.out.println("整数" + num + "的十位是:" + shi);
System.out.println("整数" + num + "的百位是:" + bai);
}
}
自增自减运算符
案例:
int i = 10;
i++; // 单独使用
System.out.println("i:" + i); // i:11
int j = 10;
++j; // 单独使用
System.out.println("j:" + j); // j:11
int x = 10;
int y = x++; // 赋值运算,++在后边,所以是使用x原来的值赋值给y,x本身自增1
System.out.println("x:" + x + ", y:" + y); // x:11,y:10
int m = 10;
int n = ++m; // 赋值运算,++在前边,所以是使用m自增后的值赋值给n,m本身自增1
System.out.println("m:" + m + ", m:" + m); // m:11,m:11
思考:
int x = 10;
int y = x++ + x++ + x++;
System.out.println(y); // y的值是多少?
/*
解析,三个表达式都是++在后,所以每次使用的都是自增前的值,但程序自左至右执行,所以第一次自增时,使用的是10进行计算,但第二次自增时,x的值已经自增到11了,所以第二次使用的是11,然后再次自增。。。
所以整个式子应该是:int y = 10 + 11 + 12;
输出结果为33。
*/
注意:通过此练习深刻理解自增和自减的规律,但实际开发中强烈建议不要写这样的代码!小心挨打!
类型转换
在Java中,不同的基本数据类型之间是不能直接参与运算的。在底层需要先进行类型转换,变成一样的类型,再进行运算。
类型转换分为两种:
- 自动类型转换(隐式转换)
- 强制类型转换
隐式转换
在Java中,不同的基本数据类型之间是不能直接参与运算的。在底层需要先进行类型转换,变成一样的类型,再进行运算。
类型转换分为两种:
int a = 10;
double num = a; // 将int类型变量a里面的值,直接赋值给double类型
System.out.println(num); // 输出10.0
取值范围从小到大关系图:
说明:
- 取值范围小的数据,和取值范围大的数据进行运算,小的会先提升为大的之后,再进行运算
- 整数默认是int类型,byte、short和char类型数据参与运算均会自动转换为int类型。
- boolean类型不能与其他基本数据类型相互转换。
案例1:
//问变量c是什么数据类型?
int a = 10;
double b = 12.3;
??? c = a + b;
//double的取值范围比int大,所以在计算的时候,变量a会自动提升为double。
//最终是两个double相加,结果就是double类型的。
案例2:
byte a = 10;
byte b = 20;
byte c = a + b;
// 第三行代码会报错,a和b会自动转换为int类型,计算结果为int,int赋值给byte需要强制类型转换。
// 修改为:
int num = b1 + b2;
案例3:
int a = 1;
char b = 'a';
int c = a + b;
System.out.println(c);
//最终输出结果:98
//b会自动转换为int类型,字符变成int类型会查询码表,变成97
//第三行代码97 + 1 最终结果为98.
强制转换
把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量。
强制类型转换格式:
目标数据类型 变量名 = (目标数据类型)值或者变量;
举例:
double num1 = 5.5;
int num2 = (int) num1; // 将double类型的num1强制转换为int类型
System.out.println(num2); // 输出5(小数位直接舍弃)
- 强制转换有可能导致精度丢失
如果超出范围的数字进行强转会导致数据错误
举例:
double num1 = 5.5;
int num2 = (int) num1; // 将double类型的num1强制转换为int类型
System.out.println(num2); // 输出5(小数位直接舍弃)
//在上面的代码中,小数5.5强转成整数,后面的小数部分就舍弃了,这就是精度的丢失。
赋值运算符
赋值运算符的作用是将一个表达式的值赋给左边,左边必须是可修改的,不能是常量。
关系运算符
关系运算符有6种关系,分别为小于、小于等于、大于、等于、大于等于、不等于。
案例:
int a = 10;
int b = 20;
System.out.println(a == b); // false
System.out.println(a != b); // true
System.out.println(a > b); // false
System.out.println(a >= b); // false
System.out.println(a < b); // true
System.out.println(a <= b); // true
// 关系运算的结果肯定是boolean类型,所以也可以将运算结果赋值给boolean类型的变量
boolean flag = a > b;
System.out.println(flag); // 输出false
逻辑运算符
- 理解层面:逻辑运算符,可以用来整合多个条件,为一段整体的逻辑
- 代码层面:连接布尔类型的表达式,或者是值
分类
案例:
//定义变量
int i = 10;
int j = 20;
int k = 30;
//& “与”,并且的关系,只要表达式中有一个值为false,结果即为false
System.out.println((i > j) & (i > k)); //false & false,输出false
System.out.println((i < j) & (i > k)); //true & false,输出false
System.out.println((i > j) & (i < k)); //false & true,输出false
System.out.println((i < j) & (i < k)); //true & true,输出true
System.out.println("--------");
//| “或”,或者的关系,只要表达式中有一个值为true,结果即为true
System.out.println((i > j) | (i > k)); //false | false,输出false
System.out.println((i < j) | (i > k)); //true | false,输出true
System.out.println((i > j) | (i < k)); //false | true,输出true
System.out.println((i < j) | (i < k)); //true | true,输出true
System.out.println("--------");
//^ “异或”,相同为false,不同为true
System.out.println((i > j) ^ (i > k)); //false ^ false,输出false
System.out.println((i < j) ^ (i > k)); //true ^ false,输出true
System.out.println((i > j) ^ (i < k)); //false ^ true,输出true
System.out.println((i < j) ^ (i < k)); //true ^ true,输出false
System.out.println("--------");
//! “非”,取反
System.out.println((i > j)); //false
System.out.println(!(i > j)); //!false,,输出true
短路逻辑运算符
案例:
int x = 3;
int y = 4;
System.out.println((x++ > 4) & (y++ > 5)); // 两个表达都会运算
System.out.println(x); // 4
System.out.println(y); // 5
System.out.println((x++ > 4) && (y++ > 5)); // 左边已经可以确定结果为false,右边不参与运算
System.out.println(x); // 4
System.out.println(y); // 4
最为常用的逻辑运算符:
&& || !
增加效率!!!!!
三元运算符
格式
关系表达式 ? 表达式1 :表达式2 ;
执行流程
问号前面的位置是判断的条件,判断结果为boolean型。
为true时调用表达式1,为false时调用表达式2。
其逻辑为:如果条件表达式成立或者满足则执行表达式1,否则执行第二个。
案例:
int a = 10;
int b = 20;
int c = a > b ? a : b; // 判断 a>b 是否为真,如果为真取a的值,如果为假,取b的值
运算符优先级(了解)
运算符的优先级就是在运算的过程中,如果出现了很多运算符,那么到底先算哪一个?在小学的时候,我们知道先乘除后加减,小括号优先于所有等等。
在Java中,运算符优先级如下图所示:
小括号优先于所有!!!
小括号优先于所有!!!
小括号优先于所有!!!