零基础学Java 之 基础语法(二)
目录
一、运算符和表达式
运算符:
就是对常量或者变量进行操作的符号。
比如: + - * /
表达式:
用运算符把常量或者变量连接起来的,符合Java语法的式子就是表达式。
比如:a + b 这个整体就是表达式。
而其中+是算术运算符的一种,所以这个表达式也称之为算术表达式。
算术运算符
分类:
+ - * / %
运算特点:
+ - * :跟小学数学中一模一样没有任何区别.
练习:数值拆分
需求:键盘录入一个三位数,将其拆分为个位、十位、百位后,打印在控制台
代码示例:
//1.键盘录入一个三位数
//导包 --- 创建对象 --- 接收数据
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个三位数");
int number = sc.nextInt();//123
//2.获取这个三位数的个位、十位、百位并打印出来
//公式:
//针对于任意的一个数而言
//个位: 数字 % 10
int ones = number % 10;
//十位: 数字 / 10 % 10
int tens = number / 10 % 10;
//百位: 数字 / 100 % 10
int hundreds = number / 100 % 10;
//输出结果
System.out.println(ones);
System.out.println(tens);
System.out.println(hundreds);
类型转换
隐式转换:把一个取值范围小的数值,转成取值范围大的数据
字符串的+操作
核心技巧:
-
当+操作中出现字符串时,此时就是字符串的连接符,会将前后的数据进行拼接,并产生一个新的字符串。
-
当连续进行+操作时,从左到右逐个执行的。
解释:
第一步:1 + 2 。在这个过程中,没有字符串参与的,所以做的是加法运算,结果为3。
第二步:3 + "abc"。在这个过程中,有字符串参与的,所以做的是拼接操作,产生一个新的字符串"3abc"。
第三步:"3abc" + 2。在这个过程中,有字符串参与的,所以做的是拼接操作,产生一个新的字符串"3abc2"。
第四步:"3abc2" + 1。在这个过程中,有字符串参与的,所以做的是拼接操作,产生一个新的字符串“3abc21”
字符的+操作
规则:
当+操作中出现了字符,会拿着字符到计算机内置的ASCII码表中去查对应的数字,然后再进行计算。
案例:
char c = 'a';
int result = c + 0;
System.out.println(result);//97
ASCII码表中:
'a' ----- 97
'A' ----- 65
- 自增自减运算符
注: 不管是先++,还是后++。单独写在一行的时候,运算结果是一模一样的。
- 赋值运算符
- 扩展赋值运算符
扩展的赋值运算符中隐层还包含了一个强制转换。
以+=为例:
a += b ;实际上相当于 a = (byte)(a + b);
xxxxxxxxxx public class OperatorDemo8 {
public static void main(String[] args) {
byte a = 10;
byte b = 20;
//a += b;
a = (byte)(a + b);
System.out.println(a);//30
}}
- 关系运算符
关系运算符最终的结果一定是布尔类型的。要么是true,要么是false
在写==的时候,千万不要写成=
- 逻辑运算符
计算规则:false取反就是true,true取反就是false
温馨提示:取反最多只用一个。
- 短路逻辑运算符
分类: && ||
&&:
运算结果跟&是一模一样的,只不过具有短路效果。
||:
运算结果跟|是一模一样的。只不过具有短路效果。
逻辑核心:
当左边不能确定整个表达式的结果,右边才会执行。
当左边能确定整个表达式的结果,那么右边就不会执行了。从而提高了代码的运行效率。
举例:
-
用户登录案例
用户名正确 & 密码正确
如果使用一个&,不管用户名是否正确都会去验证密码。
思考:
如果用户名输入正确了,那么我们再判断密码是否正确,是符合业务逻辑的。
但是如果用户名输入错误了,那么现在还有必要去比较密码吗?没有不要了。
如果使用一个&,那么左边和右边不管什么情况下,都会执行。
用户名正确 && 密码正确
如果用户名输入正确了,那么才会验证密码是否输入正确。
如果用户名输入错误了,那么就不会再去验证密码是否正确,最终的结果直接为false。从而提高了程序运行的效率。
- 三元运算符
又叫做:三元表达式或者问号冒号表达式。
格式:
关系表达式 ? 表达式1 :表达式2 ;
计算规则:
-
计算关系表达式的值。
-
如果关系表达式的值为真,那么执行表达式1。
-
如果关系表达式的值为假,那么执行表达式2。
注意点:
三元运算符的最终结果一定要被使用,要么赋值给一个变量,要么直接打印出来。
二. 流程控制语句
1.1 流程控制语句分类
顺序结构
判断和选择结构(if, switch)
循环结构(for, while, do…while)
1.2 顺序结构
顺序结构是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的。
执行流程:
①首先计算关系表达式的值
格式:
if (关系表达式) {
语句体;
}
②如果关系表达式的值为true就执行语句体
③如果关系表达式的值为false就不执行语句体
④继续执行后面的语句内容
xxxxxxxxxx public class IfDemo {
public static void main(String[] args) {
System.out.println("开始");
//定义两个变量
int a = 10;
int b = 20;
//需求:判断a和b的值是否相等,如果相等,就在控制台输出:a等于b
if(a == b) {
System.out.println("a等于b");
}
//需求:判断a和c的值是否相等,如果相等,就在控制台输出:a等于c
int c = 10;
if(a == c) {
System.out.println("a等于c");
}
System.out.println("结束");
}}
具体语法与C++大致相同
2. Switch语句
switch (表达式) {
case 1:
语句体1;
break;
case 2:
语句体2;
break;
...
default:
语句体n+1;
break;
}
- default的位置和省略情况
default可以放在任意位置,也可以省略
- case穿透
不写break会引发case穿透现象
-
switch和if第三种格式各自的使用场景
当我们需要对一个范围进行判断的时候,用if的第三种格式
当我们把有限个数据列举出来,选择其中一个执行的时候,用switch语句
比如:
小明的考试成绩,如果用switch,那么需要写100个case,太麻烦了,所以用if简单。
如果是星期,月份,客服电话中0~9的功能选择就可以用switch
3.循环结构
public class ForTest01 {
public static void main(String[] args) {
//需求:输出数据1-5
for(int i=1; i<=5; i++) {
System.out.println(i);
}
System.out.println("--------");
//需求:输出数据5-1
for(int i=5; i>=1; i--) {
System.out.println(i);
}
}
}
for循环练习-求偶数和:
- 需求:求1-100之间的偶数和,并把求和结果在控制台输出 }
- 示例代码:
public class ForTest03 {
public static void main(String[] args) {
//求和的最终结果必须保存起来,需要定义一个变量,用于保存求和的结果,初始值为0
int sum = 0;
//对1-100的数据求和与1-5的数据求和几乎完全一样,仅仅是结束条件不同
for(int i=1; i<=100; i++) {
//对1-100的偶数求和,需要对求和操作添加限制条件,判断是否是偶数
if(i%2 == 0) {
//sum += i;
sum = sum + i;
}
}
//当循环执行完毕时,将最终数据打印出来
System.out.println("1-100之间的偶数和是:" + sum);
}
}
3.1高级循环
3.1.1无限循环
概念:
又叫死循环。循环一直停不下来。
for格式:
for(;;){ System.out.println("循环执行一直在打印内容"); }
解释:
初始化语句可以空着不写,表示循环之前不定义任何的控制变量。
条件判断语句可以空着不写,如果不写,默认表示true,循环一直进行。
条件控制语句可以空着不写,表示每次循环体执行完毕后,控制变量不做任何变化。
while格式:
while(true){ System.out.println("循环执行一直在打印内容"); }
解释:
小括号里面就不能省略了,true一定要写出来,否则代码会报错。
do...while格式:
do{ System.out.println("循环执行一直在打印内容"); }while(true);
解释:
小括号里面就不能省略了,true一定要写出来,否则代码会报错。
无限循环的注意事项:
-
最为常用的格式:while
-
无限循环下面不能再写其他代码了,因为永远执行不到。
3.1.2条件控制语句
3. Random
Random跟Scanner一样,也是Java提前写好的类,我们不需要关心是如何实现的,只要直接使用就可以了。
使用步骤:
-
导包
import java.util.Random; 导包的动作必须出现在类定义的上边。
2.创建对象
Random r = new Random (); 上面这个格式里面,只有r是变量名,可以变,其他的都不允许变。
3.生成随机数
int number = r.nextInt(随机数的范围); 上面这个格式里面,只有number是变量名,可以变,其他的都不允许变。 随机数范围的特点:从0开始,不包含指定值。比如:参数为10,生成的范围[0,10)
代码示例:
//1.导包
import java.util.Random;
public class RandomDemo1 {
public static void main(String[] args) {
//2.创建对象
Random r = new Random();
//3.生成随机数
int number = r.nextInt(100);//包左不包右,包头不包尾
//0 ~ 99
System.out.println(number);
}
}
四. 小案例
4.1逢七过
/*朋友聚会的时候可能会玩一个游戏:逢7过
游戏规则:从任意一个数字开始报数,当你要报的数字是包含7或者是7的倍数时都要说过:过
需求:使用程序在控制台打印出1-100之间的满足逢七必过规则的数据*/
//分析:
//个位7 十位7 7倍数
//1 2 3 4 5 6 过 8 9 10 11 12 13 过 15 16 过 18 19 20 过....
//69 过 过 过 过 过 过... 80
//1.得到1~100之间的每一个数字
//开始:1
//结束:100
for (int i = 1; i <= 100; i++) {
//2.判断每一个数字,如果符合规则,就打印过,如果不符合规则就打印真实的数字
if(i % 10 == 7 || i / 10 % 10 == 7 || i % 7 == 0){
System.out.println("过");
continue;
}
System.out.println(i);
}
4.2 平方根
/*需求:键盘录入一个大于等于2的整数 x ,计算并返回 x 的 平方根 。
结果只保留整数部分 ,小数部分将被舍去 。*/
//分析:
//平方根 16的平方根4
// 4的平方根2
// 10
// 1 * 1 = 1 < 10
// 2 * 2 = 4 < 10
// 3 * 3 = 9 < 10
// 4 * 4 = 16 > 10
//推断:10的平方根是在3~4之间。
// 20
// 1 * 1 = 1 < 20
// 2 * 2 = 4 < 20
// 3 * 3 = 9 < 20
// 4 * 4 = 16 < 20
// 5 * 5 = 25 > 20
//推断:20的平方根是在4~5之间。
//在代码当中
//从1开始循环,拿着数字的平方跟原来的数字进行比较
//如果小于的,那么继续往后判断
//如果相等,那么当前数字就是平方根
//如果大于的,那么前一个数字就是平方跟的整数部分
//1.键盘录入一个整数
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数");
int number = sc.nextInt();
//2.从1开始循环判断
//开始:1 结束: number
for (int i = 1; i <= number; i++) {
//用i * i 再跟number进行比较
if(i * i == number){
System.out.println(i + "就是" + number + "的平方根");
//一旦找到了,循环就可以停止了,后面的数字就不需要再找了,提高代码的运行效率。
break;
}else if(i * i > number){
System.out.println((i - 1) + "就是" + number + "平方根的整数部分");
break;
}
}
4.3 判断是否为质数
//需求:键盘录入一个正整数 x ,判断该整数是否为一个质数。
//质数:
//如果一个整数只能被1和本身整除,那么这个数就是质数。否则这个数叫做合数
//7 = 1 * 7 质数
//8 = 1 * 8 2 * 4 合数
//分析:
//1.键盘录入一个正整数
//number
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个正整数");
int number = sc.nextInt();//9
//定义一个变量,表示标记
//标记着number是否为一个质数
//true: 是一个质数
//false : 不是一个质数
//表示最初就认为number是一个质数
boolean flag = true;
//2.判断
//写一个循环,从2开始判断,一直判断到number-1为止
//看这个范围之内,有没有数字可以被number整除
for (int i = 2; i < number; i++) {
//i 依次表示这个范围之内的每一个数字
//看number是否能被i整除就可以了
if(number % i == 0){// 9 % 2 = 1
flag = false;
//System.out.println(number + "不是一个质数");
break;
}/*else{
System.out.println(number + "是一个质数");
}*/
}
//只有当这个循环结束了,表示这个范围之内所有的数字都判断完毕了
//此时才能断定number是一个质数
if(flag){
System.out.println(number + "是一个质数");
}else{
System.out.println(number + "不是一个质数");
}
4.4 猜数字
//1.生成一个1-100之间的随机数
Random r = new Random();
int number = r.nextInt(100) + 1;// 0 ~ 99 + 1 --- 1 ~ 100
System.out.println(number);
//2.使用键盘录入去猜出这个数字是多少?
Scanner sc = new Scanner(System.in);
while(true){
System.out.println("请输入一个整数");
int guessNumber = sc.nextInt();
//3.比较
if(guessNumber > number){
System.out.println("您猜的数字大了");
}else if(guessNumber < number){
System.out.println("您猜的数字小了");
}else{
System.out.println("恭喜你,猜中了");
break;
}
}
五. 数组
5.1概念:
指的是一种容器,可以同来存储同种数据类型的多个值。
但是数组容器在存储数据的时候,需要结合隐式转换考虑。
比如:
定义了一个int类型的数组。那么boolean。double类型的数据是不能存到这个数组中的,
但是byte类型,short类型,int类型的数据是可以存到这个数组里面的。
5.2数组的定义
格式一:
数据类型 [] 数组名
比如:int [] array
格式二:
数据类型 数组名 []
比如: int array []
详解:
数据类型:限定了数组以后能存什么类型的数据。
方括号:表示现在定义的是一个数组。
数组名:就是一个名字而已,方便以后使用。
注意点:
方法括号跟数组名,谁写在前面,谁写在后面都是一样的。
平时习惯性使用第一种方式。
5.3 数组的静态初始化
完整格式:
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3,元素4...};
比如:
int[] arr = new int[]{11,22,33};
double[] arr = new double[]{1.1,1.2,1.3};
格式详解:
数据类型:限定了数组以后能存什么类型的数据。
方括号:表示现在定义的是一个数组。
数组名:其实就是名字而已,方便以后使用,在起名字的时候遵循小驼峰命名法。
arr namesArr
new:就是给数组在内存中开辟了一个空间。
数据类型:限定了数组以后能存什么类型的数据。
前面和后面的数据类型一定要保持一致。
int[] arr = new double[]{11,22,33};//错误写法
方括号:表示现在定义的是一个数组。
大括号:表示数组里面的元素。元素也就是存入到数组中的数据。
多个元素之间,一定要用逗号隔开。
注意点:
-
等号前后的数据类型必须保持一致。
-
数组一旦创建之后,长度不能发生变化。
简化格式:
数据类型[] 数组名 = {元素1,元素2,元素3,元素4...};
比如:
int[] array = {1,2,3,4,5};
double[] array = {1.1,1.2,1.3};
1.给数组限定什么类型? int
2.利用静态初始化完成创建并添加元素
int[] agesArr = new int[]{18,19,20,21,22};
int[] agesArr = {18,19,20,21,22};
1.给数组限定什么类型? String
2.利用静态初始化完成创建并添加元素
String[] namesArr = new String[]{"zhangsan","lisi","wangwu"};
String[] namesArr = {"zhangsan","lisi","wangwu"};
1.给数组限定什么类型? double
2.利用静态初始化完成创建并添加元素
double[] heightsArr = new double[]{1.85,1.82,1.78,1.65};
double[] heightsArr = {1.85,1.82,1.78,1.65};
5.4 数组的遍历
遍历:就是把数组里面所有的内容一个一个全部取出来。
数组的长度:数组名.length;
通用代码:
for(int i = 0; i < arr.length; i++){
//在循环的过程中,i依次表示数组中的每一个索引
sout(arr[i]);//就可以把数组里面的每一个元素都获取出来,并打印在控制台上了。
}
5.5.数组的动态初始化
格式:
数据类型[] 数组名 = new 数据类型[数组的长度];
举例:
//1.定义一个数组,存3个人的年龄,年龄未知
int[] agesArr = new int[3];
//2.定义一个数组,存班级10名学生的考试成绩,考试成绩暂时未知,考完才知道。
int[] scoresArr = new int[10];
数组的默认初始化值:
整数类型:0
小数类型:0.0
布尔类型:false
字符类型:'\u0000'
引用类型:null
5.6 数组两种初始化方式的区别
静态初始化:int[] arr = {1,2,3,4,5};
动态初始化:int[] arr = new int[3];
静态初始化:手动指定数组的元素,系统会根据元素的个数,计算出数组的长度。
动态初始化:手动指定数组长度,由系统给出默认初始化值。
使用场景:
只明确元素个数,但是不明确具体的数据,推荐使用动态初始化。
已经明确了要操作的所有数据,推荐使用静态初始化。
举例:
-
使用数组来存储键盘录入的5个整数。
int[] arr = new int[5];
-
将全班的学生成绩存入数组中,已知学生成绩为:66,77,88,99,100
int[] arr = new int[5];
arr[0] = 66;
arr[1] = 77;
... 虽然可以实现,但是太麻烦了。
建议使用静态初始化:int[] arr = {66,77,88,99,100};
5.6 数组的练习
5.6.1 求和
/*定义一个数组,存储1,2,3,4,5
遍历数组得到每一个元素,求数组里面所有的数据和*/
//分析:
//1.定义一个数组,并添加数据1,2,3,4,5
int[] arr = {1,2,3,4,5};
//求和变量
int sum = 0;
//2.遍历数组得到每一个数据,累加求和
for (int i = 0; i < arr.length; i++) {
//i 依次表示数组里面的每一个索引
//arr[i] 依次表示数组里面的每一个元素
sum = sum + arr[i];
}
//当循环结束之后,sum的值就是累加之后的结果
System.out.println(sum);
5.6.2 统计个数
//分析:
//1.定义一个数组 存储1,2,3,4,5,6,7,8,9,10
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
//定义一个变量,用来统计次数
int count = 0;
//2.遍历数组得到每一个元素
for (int i = 0; i < arr.length; i++) {
//i 表示数组里面的每一个索引
//arr[i] 表示数组里面的每一个元素
//3.判断当前的元素是否为3的倍数,如果是那么统计变量就需要自增一次。
if(arr[i] % 3 == 0){
// System.out.println(arr[i]);
count++;
}
}
//当循环结束之后,就表示数组里面所有的数字都判断完毕了,直接打印count即可
System.out.println("数组中能被3整除的数字有" + count + "个");
5.6.3 变化数据
//分析:
//1.定义一个数组,存1,2,3,4,5,6,7,8,9,10
int[] arr = {1,2,3,4,5,6,7,8,9,10};
//2.遍历数组得到每一个元素
for (int i = 0; i < arr.length; i++) {
//i 依次表示数组里面的每一个索引
//arr[i] 依次表示数组里面的每一个元素
//3.对每一个元素进行判断
if(arr[i] % 2 == 0){
//偶数 变成二分之一
arr[i] = arr[i] / 2;
}else{
//奇数 扩大两倍
arr[i] = arr[i] * 2;
}
}
//遍历数组
//一个循环尽量只做一件事情。
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
5.6.4 求最值
//定义数组求最大值:33,5,22,44,55
//扩展问题:
//1.根据求最大值的思路,自己改写一下求最小智
//2.为什么max要记录为arr[0],默认值不能为0吗?
//不能写0
//max的初始化值一定要是数组中的值。
//3.循环中开始条件一定是0吗?
//循环的开始条件如果为0,那么第一次循环的时候是自己跟自己比了一下,对结果没有任何影响,但是效率偏低
//为了提高效率,减少一次循环的次数,循环开始条件可以写1.
//1.定义数组用来存储5个值
int[] arr = {33,5,22,44,55};
//2.定义一个变量max用来存储最大值
//临时认为0索引的数据是最大的
int max = arr[0];
//3.循环获取数组中的每一个元素
//拿着每一个元素跟max进行比较
for (int i = 1; i < arr.length; i++) {
//i 索引 arr[i] 元素
if(arr[i] > max){
max = arr[i];
}
}
//4.当循环结束之后,max记录的就是数组中的最大值
System.out.println(max);//55
5.6.5 统计个数
需求:生成10个1~100之间的随机数存入数组。
1)求出所有数据的和
2)求所有数据的平均数
3)统计有多少个数据比平均值小
代码示例:
//分析:
//1.定义数组
int[] arr = new int[10];
//2.把随机数存入到数组当中
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
//每循环一次,就会生成一个新的随机数
int number = r.nextInt(100) + 1;
//把生成的随机数添加的数组当中
//数组名[索引] = 数据;
arr[i] = number;
}
// 1)求出所有数据的和
//定义求和变量
int sum = 0;
for (int i = 0; i < arr.length; i++) {
//循环得到每一个元素
//并把元素累加到sum当中
sum = sum + arr[i];
}
System.out.println("数组中所有数据的和为:" + sum);
//2)求所有数据的平均数
int avg = sum / arr.length;
System.out.println("数组中平均数为:" + avg);
//3)统计有多少个数据比平均值小
int count = 0;
for (int i = 0; i < arr.length; i++) {
if(arr[i] < avg){
count++;
}
}
//当循环结束之后,就表示我已经找到了所有的比平均数小的数据
System.out.println("在数组中,一共有" + count + "个数据,比平均数小");
//遍历数组,验证答案
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
5.6.6 交换数据
练习6:交换数据
需求:定义一个数组,存入1,2,3,4,5。按照要求交换索引对应的元素。
交换前:1,2,3,4,5
交换后:5,2,3,4,1
代码示例:
//1.定义数组存储数据
int[] arr = {1,2,3,4,5};
//2.利用循环去交换数据
for(int i = 0,j = arr.length - 1; i < j; i++,j--){
//交换变量i和变量j指向的元素
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//当循环结束之后,那么数组中的数据就实现了头尾交换
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
5.6.7:打乱数据
需求:定义一个数组,存入1~5。要求打乱数组中所有数据的顺序。
代码示例:
//1.定义数组存储1~5
int[] arr = {1, 2, 3, 4, 5};
//2.循环遍历数组,从0索引开始打乱数据的顺序
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
//生成一个随机索引
int randomIndex = r.nextInt(arr.length);
//拿着随机索引指向的元素 跟 i 指向的元素进行交换
int temp = arr[i];
arr[i] = arr[randomIndex];
arr[randomIndex] = temp;
}
//当循环结束之后,那么数组中所有的数据已经打乱顺序了
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
总结
本篇文章主要来源为B站教程,自学java基础语法。