[Java基本语法] 逻辑控制与方法

🌸个人主页:https://blog.csdn.net/2301_80050796?spm=1000.2115.3001.5343

🏵️热门专栏:🍕 Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm=1001.2014.3001.5482

🧀线程与网络(96平均质量分) https://blog.csdn.net/2301_80050796/category_12643370.html?spm=1001.2014.3001.5482

🍭MySql数据库(93平均质量分)https://blog.csdn.net/2301_80050796/category_12629890.html?spm=1001.2014.3001.5482

🍬算法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12676091.html?spm=1001.2014.3001.5482

感谢点赞与关注~~~

✒️ 今天开始,Java基本语法模块将进行重构.以保证文章质量.

目录

  • [1. 逻辑控制](#1. 逻辑控制)
    • [1.1 顺序结构](#1.1 顺序结构)
    • [1.2 分支结构](#1.2 分支结构)
      • [1.2.1 if语句](#1.2.1 if语句)
      • [1.2.2 switch语句](#1.2.2 switch语句)
    • [1.3 循环结构](#1.3 循环结构)
      • [1.3.1 while循环](#1.3.1 while循环)
      • [1.3.2 break](#1.3.2 break)
      • [1.3.3 continue](#1.3.3 continue)
      • [1.3.4 for循环](#1.3.4 for循环)
    • [1.4 输入与输出](#1.4 输入与输出)
      • [1.4.1 输出到控制台](#1.4.1 输出到控制台)
      • [1.4.2 从键盘输入](#1.4.2 从键盘输入)
  • [2. 方法的使用](#2. 方法的使用)
    • [2.1 方法的概念与使用](#2.1 方法的概念与使用)
      • [2.1.1 什么是方法](#2.1.1 什么是方法)
      • [2.1.2 方法的定义](#2.1.2 方法的定义)
      • [2.1.3 方法调用的执行过程](#2.1.3 方法调用的执行过程)
      • [2.1.4 实参和形参的关系](#2.1.4 实参和形参的关系)
    • [2.2 方法的重载](#2.2 方法的重载)
      • [2.2.1 方法重载的概念](#2.2.1 方法重载的概念)
      • [2.2.2 方法签名](#2.2.2 方法签名)
    • [2.3 递归](#2.3 递归)
      • [2.3.1 递归的概念](#2.3.1 递归的概念)
      • [2.3.2 递归执行过程分析](#2.3.2 递归执行过程分析)

1. 逻辑控制

1.1 顺序结构

顺序结构比较简单,按照代码书写一行一行地执行就可以.

java 复制代码
System.out.println("aaa");
System.out.println("bbb");
System.out.println("ccc");
 
// 运行结果
//aaa
//bbb
//ccc

1.2 分支结构

1.2.1 if语句

  1. 语法格式1

    if(布尔表达式){
    // 语句
    }

如果布尔表达式结果为true,执行if中的语句,否则不执行.

  1. 语法格式2

    if(布尔表达式){
    // 语句1
    }else{
    // 语句2
    }

如果布尔表达式结果为true,则执行if中语句,否则执行else中语句.

  1. 语法格式

    if(布尔表达式1){
    // 语句1
    }else if(布尔表达式2){
    // 语句2
    }else{
    // 语句3
    }

表达式1成立,执行语句1,否则表达式2成立,执行语句2,否则执行语句3.

[建议] if/else语句下只有一条语句的时候,可以不加花括号,此时的else和最接近的if匹配.但是实际开发中,我们不建议这样写,最好加上大括号.

java 复制代码
int x = 10;
int y = 10;
if (x == 10) 
	if (y == 10)
	System.out.println("aaa");
else 
 System.out.println("bbb");//虽然和第3行的if对齐,但是是和第4行的if匹配.

1.2.2 switch语句

  • 基本语法:

    switch(表达式){
    case 常量值1:{
    语句1;
    [break;]
    }
    case 常量值2:{
    语句2;
    [break;]
    }
    ...
    default:{
    内容都不满足时执行语句;
    [break;]
    }
    }

  • 执行流程

  1. 先计算表达式的值
  2. 和case依次比较,一旦有响应的匹配就执行该项下的语句,直到遇到break时结束
  3. 当表达式的值没有与所列项匹配时,执行default.
  • 注意事项
    • 多个case后的常量值不可以重复
    • switch的括号内不能是以下类型的数据:float,double,boolean,long.
    • break不要遗漏,否则就会失去多分支选择的效果.

1.3 循环结构

1.3.1 while循环

  • 语法格式

    while(循环条件){
    循环语句;
    }

循环条件为 true, 则执行循环语句; 否则结束循环.

[建议]

  • 和if类似,while下面可以不写花括号,但是不写的时候只能支持一条语句,建议还是加上花括号.
  • 和if类似,while后面的{建议和while写在同一行.

1.3.2 break

break 的功能是让循环提前结束.

示例:找到 100 - 200 中第一个 3 的倍数

java 复制代码
int num = 100;
while (num <= 200) {
    if (num % 3 == 0) {
        System.out.println("找到了 3 的倍数, 为:" + num);
        break;
   }
    num++;
}

1.3.3 continue

continue 的功能是跳过这次循环, 立即进入下次循环.

示例:找到 100 - 200 中所有 3 的倍数

java 复制代码
int num = 100;
while (num <= 200) {
    if (num % 3 != 0) {
        num++; 
        continue;
   }
    System.out.println("找到了 3 的倍数, 为:" + num);
    num++;
}

执行到 continue 语句的时候, 就会立刻进入下次循环(判定循环条件), 从而不会执行到下方的打印语句.

1.3.4 for循环

  • 基本语法

    for(表达式①;布尔表达式②;表达式③){
    表达式④;
    }

  • 表达式1: 用于初始化循环变量初始值设置,在循环最开始时执行,且只执行一次

  • 表达式2: 循环条件,满则循环继续,否则循环结束

  • 表达式3: 循环变量更新方式
    [注意事项] 和while类似,不再赘述

1.4 输入与输出

1.4.1 输出到控制台

  • 基本语法
java 复制代码
System.out.println(msg);            // 输出一个字符串, 带换行
System.out.print(msg);              // 输出一个字符串, 不带换行
System.out.printf(format, msg); // 格式化输出
  1. println 输出的内容自带 \n, print 不带 \n
  2. printf 的格式化输出方式和C 语言的 printf 是基本一致的.

示例:

java 复制代码
System.out.println("hello world");
 
int x = 10;
System.out.printf("x = %d\n", x)

1.4.2 从键盘输入

使用 Scanner 读取字符串/整数/浮点数.

举例说明:

java 复制代码
import java.util.Scanner;  // 需要导入 util 包
 
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的姓名:");
String name = sc.nextLine();
System.out.println("请输入你的年龄:");
int age = sc.nextInt();
System.out.println("请输入你的工资:");
float salary = sc.nextFloat();
System.out.println("你的信息如下:");
System.out.println("姓名: "+name+"\n"+"年龄:"+age+"\n"+"工资:"+salary);
sc.close(); // 注意, 要记得调用关闭方法

解释:

  • 创建一个Scanner类型的对象,使用sc引用.
  • 之后调用sc中的next()系列的方法.
    • next():返回字符串,自动消除有效字符之前的空格,直到结束符.(换行)
    • nextLine():返回字符串,不会自动消除空格,录入所有的字符,直到回车.
    • nextInt():返回十进制整数.
    • nextFloat():返回浮点数.
  • sc实质上是一个流对象的引用,我们在最后需要关闭.

2. 方法的使用

2.1 方法的概念与使用

2.1.1 什么是方法

方法就是一个代码片段. 类似于 C 语言中的 "函数".

  1. 是能够模块化的组织代码(当代码规模比较复杂的时候).
  2. 做到代码被重复使用, 一份代码可以在多个位置使用.
  3. 让代码更好理解更简单.
  4. 直接调用现有方法开发, 不必重复造轮子.

2.1.2 方法的定义

  • 语法格式

    修饰符 返回值类型 方法名称([参数类型 形参 ...]){
    方法体代码;
    [return 返回值];
    }

示例:判断一个年份是否是闰年

java 复制代码
public class Method{
	    // 方法定义
    public static boolean isLeapYear(int year){
		if((0 == year % 4 && 0 != year % 100) || 0 == year % 400){
		   return true;
		 }else{
		   return false;
		 }
	 }
}

[注意事项]

  1. 修饰符:现阶段直接使用public static 固定搭配
  2. 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成void,注意这里的返回值 和c语言有所不同,这里返回的参数还可以是数组类型.
  3. 方法名字:采用小驼峰命名
  4. 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
  5. 方法体:方法内部要执行的语句
  6. 在java当中,方法必须写在类当中
  7. 在java当中,方法不能嵌套定义.

2.1.3 方法调用的执行过程

调用方法--->传递参数--->找到方法地址--->执行被调方法的方法体--->被调方法结束返回--->回到主调方法继续往下执行

  • 方法参数传递的注意事项
  1. 匹配参数的个数
  2. 匹配参数的类型
  3. 匹配参数的顺序
  4. 匹配返回值的类型

2.1.4 实参和形参的关系

方法的形参相当于数学函数中的自变量,比如:1 + 2 + 3 + ... + n的公式为sum(n) = (1+n)*n/2.
Java中方法的形参就相当于sum函数中的自变量n,用来接收sum函数在调用时传递的值的。形参的名字可以随意取,对方法都没有任何影响,形参只是方法在定义时需要借助的一个变量,用来保存方法在调用时传递过来的值.

java 复制代码
public static int getSum(int N){    // N是形参
    return (1+N)*N / 2;
}
getSum(10);      // 10是实参,在方法调用时,形参N用来保存10
getSum(100);     // 100是实参,在方法调用时,形参N用来保存100

[注意] 在Java中,实参的值永远都是临时拷贝到形参中 ,形参和实参本质是两个实体.

代码实例:交换两个整形变量.

java 复制代码
public class TestMethod {
	public static void main(String[] args) {
		int a = 10;
		int b = 20;
		swap(a, b);
		System.out.println("main: a = " + a + " b = " + b);
	}
	
	public static void swap(int x, int y) {
		int tmp = x;
		x = y;
		y = tmp;
		System.out.println("swap: x = " + x + " y = " + y);
	}
}
 
// 运行结果
//swap: x = 20 y = 10
//main: a = 10 b = 20

可以看到,在swap函数交换之后,形参x和y的值发生了改变,但是main方法中a和b还是交换之前的值,即没有交换成功.

  • 原因解释:
    实参a和b是main方法中的两个变量,其空间在main方法的栈(一块特殊的内存空间)中,而形参x和y是swap方法中的两个变量,x和y的空间在swap方法运行时的栈中,因此:实参a和b 与 形参x和y是两个没有任何关联性的变量,在swap方法调用时,只是将实参a和b中的值拷贝了一份传递给了形参x和y,因此对形参x和y操作不会对实参a和b产生任何影响.

    [总结] 对于基础类型来说,形参相当于实参的拷贝.即传值调用.
  • 解决办法
    使用引用类型参数.(比如数组)
java 复制代码
public class TestMethod {
	public static void main(String[] args) {
	int[] array = {10, 20};
	swap(array);
	System.out.println("array[0] = " + array[0] + " array[1] = " + array[1]);
	}
	
	public static void swap(int[] arr) {
	int tmp = arr[0];
	arr[0] = arr[1];
	arr[1] = tmp;
	}
}
 
// 运行结果
//arr[0] = 20 arr[1] = 10

2.2 方法的重载

2.2.1 方法重载的概念

在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了.

参数列表不同一般指的是:个数,数据类型,或者是顺序不同.
返回值的类型是否一样,不影响方法的重载 .即只有方法的名字是一样的,参数列表必须修改,返回值类型可以修改 .

举例:下面这几个方法就相互构成重载.

java 复制代码
public class TestMethod {
	public static void main(String[] args) {
	add(1, 2);                // 调用add(int, int)
	add(1.5, 2.5);            // 调用add(double, double)
	add(1.5, 2.5, 3.5);       // 调用add(double, double, double)
	}
 
	public static int add(int x, int y) {
	return x + y;
	}
 
	public static double add(double x, double y) {
	return x + y;
	}
	
	public static double add(double x, double y, double z) {
	return x + y + z;
	}
}

2.2.2 方法签名

在同一个作用域中不能定义两个相同名称的标识符。比如:方法中不能定义两个名字一样的变量,那为什么类中就可以定义方法名相同的方法呢?

方法签名即:经过编译器编译修改过之后方法最终的名字。具体方式:方法全路径名+参数列表+返回值类型,构成方法完整的名字。

2.3 递归

2.3.1 递归的概念

从前有坐山,山上有座庙,庙里有个老和尚给小和尚将故事,讲的就是:

"从前有座山,山上有座庙,庙里有个老和尚给小和尚讲故事,讲的就是:

"从前有座山,山上有座庙..."

"从前有座山......"

上面这个故事有一个特征:自身中又包含了自己 .我们从而引出递归的概念.
一个方法在执行过程中调用自身, 就称为 "递归".

递归的必要条件:

  • 将原问题划分为其子问题.但子问题和原问题的解法相同.
  • 递归结束条件

示例:递归求n的阶乘

java 复制代码
public static void main(String[] args) {
    int n = 5;
    int ret = factor(n);
    System.out.println("ret = " + ret);
}
 
public static int factor(int n) {
    if (n == 1) {
        return 1;
   }
    return n * factor(n - 1); // factor 调用函数自身
}
 
// 执行结果
//ret = 120

2.3.2 递归执行过程分析

我们还是那上面n的阶乘来说明:

java 复制代码
public static void main(String[] args) {
    int n = 5;
    int ret = factor(n);
    System.out.println("ret = " + ret);
}
 
public static int factor(int n) {
 System.out.println("函数开始, n = " + n);
    if (n == 1) {
        System.out.println("函数结束, n = 1 ret = 1");
        return 1;
   }
    int ret = n * factor(n - 1);
    System.out.println("函数结束, n = " + n + " ret = " + ret);
    return ret;
}
 
// 执行结果
//函数开始, n = 5
//函数开始, n = 4
//函数开始, n = 3
//函数开始, n = 2
//函数开始, n = 1
//函数结束, n = 1 ret = 1
//函数结束, n = 2 ret = 2
//函数结束, n = 3 ret = 6
//函数结束, n = 4 ret = 24
//函数结束, n = 5 ret = 120
//ret = 120
相关推荐
简单.is.good4 分钟前
【测试】接口测试与接口自动化
开发语言·python
我行我素,向往自由5 分钟前
速成java记录(上)
java·速成
一直学习永不止步11 分钟前
LeetCode题练习与总结:H 指数--274
java·数据结构·算法·leetcode·数组·排序·计数排序
邵泽明12 分钟前
面试知识储备-多线程
java·面试·职场和发展
Yvemil724 分钟前
MQ 架构设计原理与消息中间件详解(二)
开发语言·后端·ruby
程序员是干活的25 分钟前
私家车开车回家过节会发生什么事情
java·开发语言·软件构建·1024程序员节
煸橙干儿~~35 分钟前
分析JS Crash(进程崩溃)
java·前端·javascript
2401_8543910836 分钟前
Spring Boot大学生就业招聘系统的开发与部署
java·spring boot·后端
Amor风信子37 分钟前
华为OD机试真题---跳房子II
java·数据结构·算法
我是陈泽40 分钟前
一行 Python 代码能实现什么丧心病狂的功能?圣诞树源代码
开发语言·python·程序员·编程·python教程·python学习·python教学