初识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上这一摞盘子,

  1. 首先需要将上面的三个盘子转移至B,我们才能移动最大的盘子到C,那么在此过程中A的盘子原来所在的柱子,我们称为原柱,B是我们要将上面三个盘子转移到的柱子,我们称为目标柱,C柱用来暂时存放盘子,我们称为辅柱

  2. 在将上面的盘子转移到B后,A柱的最大的盘子便可转移到C柱上,

  3. 然后再将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。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/10308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蛋糕店做配送小程序的作用是什么

蛋糕烘焙除了生日需要&#xff0c;对喜吃之人来说往往复购率较高&#xff0c;除线下实体店经营外&#xff0c;更多的商家选择线上多种方式获客转化、持续提高生意营收&#xff0c;而除了进驻第三方平台外&#xff0c;构建品牌私域自营店铺也同样重要。 运用【雨科】平台搭建蛋…

ABAP跨client的RFC调用

1、SM59配置连接 2、创建需要调用的函数&#xff0c;ZGET_TM_LIST&#xff0c;开启远程启用模块 3、新建调用程序 DATA:L_MSG TYPE C,LSH(30) TYPE C. DATA:IT_ZSTM_LIST TYPE STANDARD TABLE OF ZSTM_LIST WITH HEADER LINE.CALL FUNCTION ZGET_TM_LIST DESTINATION ZTEST_R…

【回溯 网格 状态压缩】52. N 皇后 II

本文涉及知识点 回溯 网格 状态压缩 LeetCode52. N 皇后 II n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回 n 皇后问题 不同的解决方案的数量。 示例 1&#xff1a; 输入&#x…

python3如何安装bs4

在python官网找到beautifulsoup模块的下载页面&#xff0c;点击"downloap"将该模块的安装包下载到本地。 将该安装包解压&#xff0c;然后在打开cmd&#xff0c;并通过cmd进入到该安装包解压后的文件夹目录下。 在该文件目录下输入"python install setup.py&quo…

信息系统架构模型_3.企业数据交换总线

1.企业数据交换总线 实践中&#xff0c;还有一种较常用的架构&#xff0c;即企业数据交换总线&#xff0c;即不同的企业应用之间进行信息交换的公共通道&#xff0c;如图1所示。 图1 企业数据交换总线架构 这种架构在大型企业不同应用系统进行信息交换时使用较普遍&am…

前端笔记-day05

文章目录 01-结构伪类选择器02-结构伪类选择器-公式用法03-伪元素选择器04-盒子模型-组成05-盒子模型-边框线06-盒子模型-单方向边框线07-盒子模型-内边距08-盒子模型-padding多值写法09-盒子模型-尺寸计算10-盒子模型-版心居中11-清除默认样式12-元素溢出overflow13-外边距合并…

嵌入式基础课程配套电机FOC伺服电机开发板AT32F403磁编码IMU姿态

嵌入式基础课程配套电机FOC伺服电机开发板AT32F403磁编码IMU姿态 带你入门嵌入式有二十多年开发经验的老技骨做技术支持整个开发包硬件包括电机2205&#xff0c;支持12V到24V宽输入&#xff0c;配套12V2A电源。包装原理图和PCB嵌入式软件嵌入式基础课程 带你入门嵌入式 电机FO…

即插即用篇 | YOLOv8引入局部自注意力 HaloAttention | 为参数高效的视觉主干网络扩展局部自注意力

本改进已集成到 YOLOv8-Magic 框架。 我们提出了Axial Transformers,这是一个基于自注意力的自回归模型,用于图像和其他组织为高维张量的数据。现有的自回归模型要么因高维数据的计算资源需求过大而受到限制,要么为了减少资源需求而在分布表达性或实现的便捷性上做出妥协。相…

嵌入式C语言高级教程:实现基于STM32的无人机飞控系统

无人机飞控系统是无人机的大脑&#xff0c;负责处理来自各种传感器的数据并控制无人机的飞行。本教程将指导如何在STM32微控制器上实现一个基础的无人机飞控系统。 一、开发环境准备 硬件要求 微控制器&#xff1a;STM32F405RGT6&#xff0c;因其高性能和大量的输入输出接口…

机器学习算法应用——K近邻分类器(KNN)

K近邻分类器&#xff08;KNN&#xff09;&#xff08;4-2&#xff09; K近邻分类器&#xff08;K-Nearest Neighbor&#xff0c;简称KNN&#xff09;是一种基本的机器学习分类算法。它的工作原理是&#xff1a;在特征空间中&#xff0c;如果一个样本在特征空间中的K个最相邻的样…

交通数据三维可视化呈现与可视化分析系统开发(附程序源码)

目录 01 系统介绍 02 功能介绍 文件管理功能 模型研究 可视化分析功能 今天分享一套“交通数据三维可视化呈现与可视化分析系统”&#xff0c;并开放程序源代码下载&#xff0c;内容涉及开源空间数据库的使用、三维引擎的二次开发、矢量和栅格数据管理、交通流量分析模型框…

【18-Ⅱ】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础&#xff0c;通过阅读Java廖雪峰网站&#xff0c;简单速成了java&#xff0c;但对其中一些入门概念有所疏漏&#xff0c;阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

Qt | QSpinBox 类 QDoubleSpinBox 类(微调框)

01、QSpinBox 类 1、QSpinBox类是 QAbstractSpinBox 类的直接子类和具体实现, 2、QSpinBox 类被设计用于处理整数和离散值集合,对于浮点值使用 QDoubleSpinBox 类实现。 3、QSpinBox 默认只支持整数值,但可通过其内部的成员函数进行扩展,以支持使用不同的 字符串。 02…

ROS2 工作空间

文章目录 ROS2 工作空间创建工作空间自动安装依赖编译工作空间设置环境变量参考链接 ROS2 工作空间 工作空间可以简单理解为工程目录。 ROS 系统中一个典型的工作空间结构如图所示&#xff1a; dev_ws&#xff1a; 根目录&#xff0c;里面会有四个子目录&#xff08;子空间&a…

视频资源汇聚平台常见的几种接入方式

视频资源汇聚平台 视频汇聚平台可以实现海量资源的接入、汇聚、存储、处理、分析、运维等&#xff0c;平台具备轻量化接入能力&#xff0c;可支持多协议方式接入&#xff0c;包括主流标准协议GB28181、RTSP、ONVIF、RTMP、FLV、WEBSOCKET等&#xff0c;以及厂家私有协议与SDK接…

信息系统架构模型_2.面向服务架构(SOA)模式

前面讲的客户机/服务器模式&#xff0c;无论多少层的C/S软件结构&#xff0c;对外来讲&#xff0c;都只是一个单结点应用&#xff08;无论它由多个不同层的“服务”相互配合来完成其功能&#xff09;&#xff0c;具体表现为一个门户网站、一个应用系统等。而多个单点应用相互通…

最新ChatGPT中文系统网站源码+系统部署+支持AI对话、AI绘画、AI音乐等大模型

一、系统介绍 本文将介绍最新的ChatGPT中文版AI创作系统——星河易创AI系统&#xff0c;该系统基于ChatGPT的核心技术&#xff0c;融合了自然语言问答、绘画、音乐等创作功能&#xff0c;并兼容官方GPT全模型。该系统提供多样化的应用&#xff0c;包括GPTs的多场景应用、实时G…

C++错题集(持续更新ing)

Day 1 一、选择题 解析&#xff1a; 在数字不会溢出的前提下&#xff0c;对于正数和负数&#xff0c;有&#xff1a; 1&#xff09;左移n位&#xff0c;相当于操作数乘以2的n次方&#xff1b; 2&#xff09;右移n位&#xff0c;相当于操作数除以2的n次方。 解析&#xff1a…

示例七、超声波传感器测距

通过以下几个示例来具体展开学习,了解超声波传感器原理及特性&#xff0c;学习超声波传感器的应用&#xff1a; 示例七、超声波传感器测距 一、基本原理&#xff1a; 1、超声波测距仪的系统结构 利用超声测距原理测量物体之间的距离&#xff0c;当此距离小于某一设定值时&…

融合Transformer与CNN,实现各任务性能巅峰,可训练参数减少80%

论文er看过来&#xff0c;今天给各位推荐一个热门创新方向&#xff1a;CNNTransformer。 众所周知&#xff0c;CNN通过多层卷积自动学习空间层级特征&#xff0c;能够有效提取图像局部特征。而Transformer通过自注意力机制全局建模&#xff0c;能够有效处理长距离依赖关系。 …