初识java--javaSE(3)--方法,递归,数组,
文章目录
- 一 方法的使用
- 1.1 什么是方法?
- main方法
- 注意事项
- 1.2 方法的调用
- 嵌套调用
- 在方法调用时形参与实参的关系:
- 1.3 方法的重载
- 方法重载的意义?
- 总结方法重载:
- 方法签名:
- 二 递归
- 什么是递归?
- 递归的精髓:
- 举例:
- 汉诺塔问题:
- 三 数组
- 1 数组的定义
- 定义
- 默认初始值
- 2 遍历数组的方式
- 通过for语句
- 通过foreach语句
- 通过Arrays类
- 3 引用数据类型与基本数据类型的区别
- 区别1::
- 区别2 :
- 引用数据类型:
- 4 有关数组方法的使用
- 二分查找方法
- 排序的方法
- 5 二维数组
- 二维数组的定义方式:
- 二维数组的遍历:
一 方法的使用
1.1 什么是方法?
方法类似于c语言中函数,
//方法的形式是:
/*
public static 返回值类型 方法名 (形式参数列表){方法体
}*///其中public static 属于修饰符的部分, 先当做默认的方法格式,以后会阐述到
public static int add(int a,int b){return a+b;}

没有main方法的调用,此方法是执行不了的。
main方法
main方法:java程序是从main方法开始执行的,这与c语言main函数的作用类似。一个类中只能有一个main方法.
/* public static void main(String[] args) {方法体
}*/
在main方法格式中:
public static以后再阐述,先当做一种必备的格式void是返回值类型, main是main方法特有的函数名
String[] args是字符串类型的数组
注意事项
1 java中方法不能够嵌套定义!
2 java中方法没有声明的说法!
3 java中,方法如果有返回值,则返回值类型与返回的实体类型必须保持一致!(没有c语言中当返回类型与返回实际值类型不一样应该返回谁的说法。)如果没有返回值,则设置成void类型
4 在java中方法必须定义在类中。
5 修饰符:当前默认为public static 以后会阐述到,
6 方法名字采用小驼峰命名(即方法名字如果有两个单词组成,将后面单词的首字母大写,如果只有一个单词则小写即可)
1.2 方法的调用
java中方法的调用与c语言中的函数调用没有区别
嵌套调用
public static void print(){System.out.println("我嵌套调用了方法!");}public static int add(int x,int y){print();return x+y;}public static void main(String[] args) {System.out.println(add(5,3));}

在方法调用时形参与实参的关系:
java方法调用与c语言函数调用的形参与实参的关系是相同的,用下面这个代码分析:
public static int func1(int x){if(x>1){return 1;}else {return 0;}
}public static void main(String[] args) {func1(5);}

如图解析:形参的改变不会影响实参
public static int func1(int x){
//将形参中的x值改为10,观察实参中值是否会变?x=10;if(x>1){return 1;}else {return 0;}
}public static void main(String[] args) {int x = 5;func1(x);System.out.println(x);}

结果并未发生变化!
1.3 方法的重载
在java中可以有两个名字相同的方法,那如何区分不同之处呢?取决于方法的参数列表
方法重载的意义?
这样做的目的是方便程序员不需要记录过多的方法名,而选择调用实现的功能大体相同,但操作数据不同的方法。
举例:
public static int add(int a,int b){return a+b;}public static double add(double a,double b,double c){return a+b+c;}//创建main方法:public static void main(String[] args) {double d1 = add(3.14,5.2,6.4);System.out.println(d1);int i = add(5,6);System.out.println(i);}

另一种情况:
public static void add(int a,int b) {return;}public static int add(int a,int b){return a+b;}

此时编译器会报错,原因在于返回值类型与方法重载无关
总结方法重载:
//总结:对于方法重载的规则:// 1 方法名必须相同// 2 参数列表必须不同(个数,类型,顺序)// 3 返回值类型与重载无关!
方法签名:
在作用域中不能有两个相同名字的标识符,比如不能定义两个相同名字的变量,但是为啥类中就可以定义两个相同名字的方法呢?
因为方法签名才是方法最终的名字!
方法签名即:经过编译器编译修改过之后的名字。具体方式:方法的全路径名+参数列表+返回值类型,构成方法完整的名字
二 递归
什么是递归?
递归就是方法自己调用自己,通过自身的规则将大问题分解成小问题,最后解决问题。
递归的精髓:
递归的精髓一:是找到将大问题转换为小问题的规则。
递归的精髓二:是找到最后的“界限“,可以使得自身的嵌套停止,不然就成为了死循环。
递归的精髓三:我们可以用一条语句来表示规则,也可以用两条语句表示规则,最重要的是后面的语句代表的规则不会改变前面语句代表规则的执行。比如下面汉诺塔的两条语句便互不影响。
举例:
//求阶乘之和//求n!+(n-1)!+.....1!
public static void main(String[] args) {System.out.println(func2(2)) ; //结果为3System.out.println(func3(5)); //结果为:5! + 4!+3!+2!+1! = 120+24+6+2+1 ==153
}public static int func2(int n){int sum = 0;if(n==1){return 1;}else {sum = func3(n)+func2(n-1);}return sum;}
//求单个阶乘public static int func3(int n){int ret =0;if(n==1){return 1;}else {ret = n*func3(n-1);}return ret;}

在求阶乘之和时,我们不能找到一个既能求阶乘又能时期相加的规则,
这个问题求阶乘与求阶乘之和本质上是两条规则,所以我们用了两个函数来实现
汉诺塔问题:
这是一个十分经典的问题:
给三根柱子A,B,C,A柱上有一摞从下到上依次增大的盘子,要求将这些盘子转移到C柱上,在转移过程中有几条规则:
(1)一次只能转移一个盘子
(2)在转移的任何时刻,大盘子不能放在小盘子上面
(3)操作过程中盘子可以置于A、B、C任一杆上。
如图:

我们要转移A上这一摞盘子,
-
首先需要将上面的三个盘子转移至B,我们才能移动最大的盘子到C,那么在此过程中A的盘子原来所在的柱子,我们称为原柱,B是我们要将上面三个盘子转移到的柱子,我们称为目标柱,C柱用来暂时存放盘子,我们称为辅柱,
-
在将上面的盘子转移到B后,A柱的最大的盘子便可转移到C柱上,
-
然后再将B柱上的盘子,全部转移至C柱,此时B柱变为原柱,C柱变为目标柱,A柱变为辅柱。
代码实现:
//汉诺塔问题public static void func2(int n,char a,char b,char c){//n代表盘子的数量,也表示盘子的序号,越小的盘子,序号越小if(n==1){System.out.printf(" 转移%d号盘子,从%c柱到%c柱\n",n,a,c);}else {//如果盘子的数量大于1,则现将A柱上面的一摞盘子转移至B柱func2(n-1,a,c,b);//然后将此时A柱上最大的盘子转移至C柱System.out.printf("转移%d号盘子,从%c柱到%c柱\n",n,a,c);//然后将B柱上的一摞盘子转移至C柱,A作为辅柱func2(n-1,b,a,c);}}public static void main(String[] args) {func2(3,'A','B','C');}

三 数组
1 数组的定义
定义
//数组的定义://1 定义但不初始化int [] arr = new int[5];//new关键字是创建一个新的对象,这个在后面的博客中会阐述到。//2 定义并且初始化int []arr1 = new int[]{1,2,3,4};int [] arr2 ={1,2,3,4}; //这种方式与上面的没有区别//3 先定义,然后再初始化,这是错误的int []arr3;//arr3 = {1,2,3,4};//3 只有在定义时才可以对数组整体进行初始化//4 我们也可以采用c语言中定义数组的方式:int arr6 [] = {1,5};
java中数组的定义比c语言中的更规范,因为前面是数据类型,后面是变量名,
这样的定义方式很规整!
默认初始值
for (int x:arr) {System.out.println(x);};for (int x:arr2) { //但是定义未指定数组大小时,//数组中没有默认的值,这是因为并没有给本数组//分配堆空间,无法赋值System.out.println(x);}


2 遍历数组的方式
通过for语句
其中arr.length是数组的长度
int [] arr = new int[5];for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}


通过foreach语句
对于foreach语句,在冒号之前是创建的临时变量,冒号之后是数组名,
此语句的作用即是遍历数组的元素,赋值到变量x当中去。
for (int x:arr) {System.out.println(x);};

此语句只能输出数组的内容,而不能使用数组的下标!
通过Arrays类
Arrays类中的toString方法可以将数组中的数据转换成字符串形式!
举例:
System.out.println(Arrays.toString(arr));

3 引用数据类型与基本数据类型的区别
区别1::
//系统在为变量分配内存时,均在栈区上分配,// 对于基本数据类型,数据就存放在在栈区分配的内存上// 对于引用数据类型,栈区的内存中存放的是类似于地址的数据,我们可以看做地址// 在真正存放数据的空间是开辟在堆上的,并将此块空间的地址放在栈区空间内。
如图:

区别2 :
引用数据类型在当参数时,是可以通过修改形参而改变形参的。
但是基本数据类型做不到
public static void func1(int []array){array[0] = 99;}public static void main(String[] args) {int []array = {0,1,2,3,4};func1(array);System.out.println(Arrays.toString(array));}

引用数据类型:
引用:我们称引用数据类型变量的值为引用,类似于c语言指针,一个引用只能指向一个对象。

如图,当我们传参后,形参中的引用被新创建的对象的引用所替代。
null :当引用类型变量的值为null时,代表这个引用不指向任何对象。
public static void main(String[] args) {int []array = null;}
当array1 = array2;代表两个引用指向了同一个对象
public static void main(String[] args) {int []array = {1,2,3};int []array1 =array;System.out.println(Arrays.toString(array));System.out.println(Arrays.toString(array1));}

4 有关数组方法的使用
二分查找方法
public static void main(String[] args) {int [] arr = {1,2,3,4,5,6,5,};int c = Arrays.binarySearch(arr , 6 );System.out.println(c);}

排序的方法
public static void main(String[] args) {int [] arr = {1,2,3,4,5,6,5,};Arrays.sort(arr);System.out.println(Arrays.toString(arr));}

5 二维数组
二维数组的定义方式:
//定义的形式//1 int [][]arr =new int[][]{{1,2,3},{1,2,3,4,5}};//2 int [][] arr3 = {{1,2,3},{4,5,6}} ;// 2 //当定义指定数组大小时,不能够初始化int [][] arr1 = new int[2][3];// 3 // 不规则定义:只指定行,不指定列,这个规则与c语言中恰好相反int [][] arr2 = new int[2][];arr2[0] = new int [3];arr [1] = new int [5];
二维数组的遍历:
第一种方式:
对于二维数组有几个元素(一维数组)由二维数组名.length判断
每个一维数组有多少元素,arr[i].length判断。
int [][]arr =new int[][]{{1,2,3},{1,2,3,4,5}};for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[i].length; j++) {System.out.print(arr[i][j]);}System.out.println();}
第二种方式:
for (int [] tmp:arr) {for (int x:tmp) {System.out.print(x);}

注意:
对于不规则二维数组未初始化时,遍历是会报错的,原因在于我们没有给定有多少列,所以系统会自动为每个一维数组赋值为null。

相关文章:
初识java--javaSE(3)--方法,递归,数组,
文章目录 一 方法的使用1.1 什么是方法?main方法注意事项 1.2 方法的调用嵌套调用在方法调用时形参与实参的关系: 1.3 方法的重载方法重载的意义?总结方法重载:方法签名: 二 递归什么是递归?递归的精髓&…...
AWS ECS Fargate: 如何获取正在运行的服务
AWS Fargate 是一个无服务器计算引擎,用于容器,可以与 Amazon Elastic Container Service (ECS) 配合使用,实现容器的自动部署、管理、扩展和调整。在日常的开发和运维过程中,了解哪些服务正在运行及其状态是非常重要的。本文将介绍如何使用 Python 和 AWS SDK(boto3)来检…...
Rust 常用 Web 开源代码库
Rust的web开发有许多优秀的开源库可供选择,以下是一些值得关注的库: Web框架: Axum:由Rust社区的异步事实标准Tokio团队开发,以高性能和强大的异步支持著称。其特点包括使用无宏API将请求路由到处理程序、使用提取器以…...
零代码平台助力中国石化江苏油田实现高效评价体系
概述: 中国石化集团江苏石油勘探局有限公司面临着评价体系依赖人工处理数据、计算繁琐且容易出错的挑战。为解决这一问题,他们决定借助零代码平台明道云开发江苏油田高质量发展经济指标评价系统。该系统旨在实现原始数据批量导入与在线管理、权重及评分…...
[优选算法]------滑动窗⼝——209. 长度最小的子数组
目录 1.题目 1.解法⼀(暴⼒求解)(会超时): 2.解法⼆(滑动窗⼝): 1.算法思路: 2.手撕图解 3.代码实现 1.C 2.C语言 1.题目 209. 长度最小的子数组 给定一个含有 n…...
简述a标签target属性的取值和作用
在HTML中,<a>标签(锚标签)的target属性用于指定链接的打开方式。该属性定义了当用户点击链接时,链接将如何被打开。以下是target属性的常见取值及其作用: 1. _self(默认值) - 打开链接…...
uniapp管理后台编写,基于uniadmin和vue3实现uniapp小程序的管理后台
一,创建uniAdmin项目 打开开发者工具Hbuilder,然后点击左上角的文件,点新建,点项目。如下图。 选择uniadmin,编写项目名,然后使用vue3 记得选用阿里云服务器,因为最便宜 点击创建,等待项目创…...
FFmpeg常用API与示例(四)——过滤器实战
1.filter 在多媒体处理中,filter 的意思是被编码到输出文件之前用来修改输入文件内容的一个软件工具。如:视频翻转,旋转,缩放等。 语法:[input_link_label1]… filter_nameparameters [output_link_label1]… 1、视…...
解决springboot项目的网站静态页面显示不全问题
在通过springboot搭建项目时,为了能够访问静态的前端页面,我们考虑到访问的优先级问题,通常选择将资源放在recourses/static的目录下,如下: 这时可能会出现类似于下面这种图片无法加载、没有按照指定位置显示的情况&am…...
表面的相似,本质的不同
韩信与韩王信,两个韩信的结局都是被刘邦所杀,似乎结局类似。但是,略加分析,就会发现其中存在本质的区别。 韩信属于必杀。他的王位是要来的,有居功自傲的本意,功高震主而且毫不避讳。而且年轻,…...
问题:幂等性 分布式session
web项目中请求线程到service层的时候远程调用服务之前是串行化执行每个任务都要get阻塞等待任务完成,举例当用户在购物车页面点击去结算就会请求后台toTrade请求获取订单确认的详情数据并渲染到订单详情页,现在在toTrade请求中使用异步任务编排Completab…...
Golang | Leetcode Golang题解之第66题加一
题目: 题解: func plusOne(digits []int) []int {n : len(digits)for i : n - 1; i > 0; i-- {if digits[i] ! 9 {digits[i]for j : i 1; j < n; j {digits[j] 0}return digits}}// digits 中所有的元素均为 9digits make([]int, n1)digits[0]…...
c++ STL 之栈—— stack 详解
vector 是 stl 的一个关联容器,名叫“栈”,何为“栈”?其实就是一个数组,但有了数组何必还需栈,这是一个高深的问题。 一、简介 1. 定义 栈,是一个柔性数组(可变长数组),可以变大变小…...
鸿蒙开发接口Ability框架:【(窗口扩展能力)】
窗口扩展能力 WindowExtensionAbility基于ExtensionAbility,WindowExtensionAbility中展示的内容作为一个控件(AbilityComponent)内容展示在其他应用窗口中,实现在一个窗口中展示多个应用程序内容的功能。 说明: 本模块首批接口从API versio…...
AutoCAD中密集的填充打散后消失的问题
有时候在AutoCAD中,图案填充的填充面积过大或填充太过密集时,将该填充打散,也就是执行Explode时,会发现填充图案消失了。 原因是打散后线条太大,系统就不显示了。可以通过设置:HPMAXLINES 值,来…...
基于Matplotlib的模型性能可视化工作
一、项目简介 本项目是科技考古墓葬识别工作的中间过程,因为需要大量复用所以另起一章好了。 主要涉及到数据读取、数据可视化和少量的数据处理过程。 二、相关知识 PandasMatplotlib 三、实验过程 1. 数据探索性分析 1.1 准备工作–导入模块 import pandas…...
KAN网络最全解析——比肩MLP和Transformer?
1 基本思路 1.1 MLP与Spline的优缺点 多层感知器 (MLP)是深度学习的基础理论模块,是目前可用于逼近非线性函数的默认模型,其表征能力已由通用逼近定理证明。但MLP也有明显的缺点,例如在 Transformer中,MLP 的参数量巨大…...
ASP.NET学生信息管理系统
摘 要 本文介绍了在ASP.net环境下采用“自上而下地总体规划,自下而上地应用开发”的策略开发一个管理信息系统的过程。通过分析某一学校学生管理的不足,创建了一套行之有效的计算机管理学生的方案。文章介绍了学生管理信息系统的系统分析部分,…...
图片改大小尺寸怎么改?几招教你搞定图片修改
在社交媒体平台上发布图片时,调整图片的尺寸大小可以确保图片适合平台的要求,不同的社交媒体平台可能对图片的尺寸有不同的要求,通过调整图片尺寸,可以更加完美的展现出来,那么有没有比较简单的图片改大小的方法呢&…...
Scala编程入门:从零开始的完整教程
目录 引言环境准备创建第一个Scala项目基本语法高阶概念进阶资源结语 引言 Scala是一种强大的、静态类型的、多范式编程语言,它结合了面向对象和函数式编程的特点。本教程将指导您如何从零开始学习Scala,并搭建一个简单的开发环境。让我们开始探索Scala…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
