初识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)) ;  //结果为3
    System.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.mfbz.cn/a/614838.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BUU-[GXYCTF2019]Ping Ping Ping

考察点 命令执行 题目 解题 简单测试 ?ip应该是一个提示&#xff0c;那么就测试一下?ip127.0.0.1 http://0c02a46a-5ac2-45f5-99da-3d1b0b951307.node4.buuoj.cn:81/?ip127.0.0.1发现正常回显 列出文件 那么猜测一下可能会有命令执行漏洞&#xff0c;测试?ip127.0.…

Github图片显示不出来?两步解决!

很多同学可能和我一样&#xff0c;在GitHub中找一些项目或者资料的时候&#xff1b;总是会看到一些图片显示不出来&#xff0c;或者数学公式乱码&#xff1a; 比如这样 还有这样 其实这个主要是因为DNS污染导致的&#xff0c;具体大家可以百度&#xff0c;这边不详细介绍。 解决…

libcity笔记:

1 __init__ 2 encode 得到的内容如下&#xff1a; data_feature的内容&#xff1a; 一共有多少个location1【包括pad的一个】最长的时间间隔&#xff08;秒&#xff09;最长的距离间隔&#xff08;千米&#xff09;多少个useer idpadding 的locationidpad_item的内容 location…

ppt---C语言

注意某些符号和我们手写的不一样&#xff08;&#xff09;乘法&#xff0c;除法等

实现桌面动态壁纸——认识 WebView2 控件

目录 前言 一、什么是 WebView2 &#xff1f; 二、使用示例存储库 2.1 下载存储库 2.2 编译解决方案项目文件 2.3 运行示例程序 三、如何修改 WebView2 示例 本文来源于&#xff1a;https://blog.csdn.net/qq_59075481/article/details/138637909。 前言 上一节我们讲…

05-10 周五 FastBuild 容器启动引起超时问题定位与解决

05-10 周五 FastBuild 容器启动超时问题 时间版本修改人描述2024年5月11日16:45:33V0.1宋全恒新建文档2024年5月11日22:37:21V1.0宋全恒完成解决方案的撰写&#xff0c;包括问题分析&#xff0c;docker命令 简介 关于FastBuild的优化&#xff0c;已经撰写了多个博客&#xff0…

书生浦语训练营第四次课作业

基础作业 环境配置 拷贝internlm开发机内的环境 studio-conda xtuner0.1.17# 激活环境 conda activate xtuner0.1.17 # 进入家目录 &#xff08;~的意思是 “当前用户的home路径”&#xff09; cd ~ # 创建版本文件夹并进入&#xff0c;以跟随本教程 mkdir -p /root/xtuner0…

Celery Redis 集群版连接和PyCharm启动配置

目录 使用Redis cluster版作为broker原因 PyCharm配置 使用Redis cluster版作为broker 在celery5及其之前版本&#xff0c;需要配置如下才可行 celery_app.conf.update( broker_transport_options{“global_keyprefix”: “{celery}:”}, ) 原因 https://github.com/celery/…

【练习4】

1.两数之和 暴力&#xff1a; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {int n nums.size();vector<int> res(2, -1); // 初始化结果为-1for (int i 0; i < n; i) {int temp nums[i];for (int j i 1; j <…

若依修改表格滚动条宽度

找到目录ruoyi-ui/src/assets/styles/ruoyi.scss 添加滚动条样式 //修改滚动条的宽度和高度&#xff08;横向是高度&#xff0c;纵向是宽度&#xff09;::-webkit-scrollbar {width: 14px;height: 14px;background-color: transparent;}

配置Docker对象与管理守护进程

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 本章节的快速目录导航&#xff1a; 一、配置Docker对象 1.1、Docker对象的标记 1.2、格式化命令和日志的输出 二、示例&#xff1a; 2.1、管理…

大模型微调之 在亚马逊AWS上实战LlaMA案例(十)

大模型微调之 在亚马逊AWS上实战LlaMA案例&#xff08;十&#xff09; 训练数据集格式 SageMaker JumpStart 目前支持域适应格式和指令调整格式的数据集。在本节中&#xff0c;我们指定两种格式的示例数据集。有关更多详细信息&#xff0c;请参阅附录中的数据集格式化部分。 …

ECharts系列:基本使用及配置项

目录 基本使用 配置项的写法与位置 配置项option包含属性 各个配置项属性大全 基本使用 在阅读本篇文章时请参考ECharts官网地址中的内容配合了解 首先我们知道ECharts图表中有许多类型&#xff0c;如折线图、柱状图、饼形图等&#xff0c;下面我以折线图为例讲解ECharts图…

户籍管理系统的设计与实现

【免费】户籍管理系统的设计与实现.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89296790 ​​​​​​​户籍管理系统的设计与实现 摘 要 当今社会人们生活质量越来越高&#xff0c;人们对生活品质的追求不断提升&#xff0c;对于孩子求学&#xff0c;变更住…

【一站式学会Kotlin】第四节默认参数和具名参数、unit返回值类型

作者介绍&#xff1a; 百度资深Android工程师T6&#xff0c;在百度任职7年半。 目前&#xff1a;成立赵小灰代码工作室&#xff0c;欢迎大家找我交流Android、微信小程序、鸿蒙项目。文章底部&#xff0c;csdn有为我插入微信的联络方式&#xff0c;欢迎大家联络我。 一&#x…

C++笔试强训day18

目录 1.压缩字符串 2.chika和蜜柑 3.01背包 1.压缩字符串 链接 注意细节&#xff1a; 1.数量为一个时不用输出个数 2.当数量超过 9 时&#xff0c;需要逐个拿出 n 的位数&#xff0c;如153次&#xff0c;需要拿出1、5、3三个数 详细代码&#xff1a; class Solution { publ…

Apache Sqoop:高效数据传输工具搭建与使用教程

目录 引言一、环境准备二、安装sqoop下载sqoop包解压文件 三、配置Sqoop下载mysql驱动拷贝hive的归档文件配置环境变量修改sqoop-env.sh配置文件替换版本的commons-lang的jar包 验证Sqoop安装查看Sqoop版本测试Sqoop连接MySQL数据库是否成功查看数据库查看数据表去除警告信息 四…

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

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

静态分析-RIPS-源码解析记录-03

既然有源码可以debug&#xff0c;那么直接跑测试用例&#xff0c;来跟踪处理逻辑感觉比直接看代码理逻辑更快一些&#xff0c;尤其是涉及到了扫描阶段&#xff0c;不然不容易弄清某刻某个变量的取值。 对于所有漏洞而言&#xff0c;都是由sink点到source点检测是否有过滤函数&…

毕业论文凑字数——关于IVR自动语音应答交互式电话导航自动总机等等概念的一些剖析

目录 IVR毕业论文的讨巧思路IVR自动语音应答IVR的使用流程IVR的各种应用IVR的基本配置 一个小朋友的毕业论文要凑字数&#xff0c;所以推荐她讲一讲IVR&#xff0c;因为IVR可以翻译的名字很多&#xff0c;比如交互式语音应答&#xff0c;自动语音应答&#xff0c;自动语音服务&…