Java中方法的使用、重载与递归的详细介绍
作者:ViolentAsteroid 发布时间:2022-03-02 02:50:05
一.方法的基本使用
1.什么是方法
方法是一个代码片段,类似于C语言中的函数
2.方法基本语法
基本语法
// 方法定义
public static 方法返回值 方法名称(参数类型 形参){
方法体代码;
return 返回值;
}
public static void main(String[] args) {
// 方法调用
返回值变量 = 方法名称 (实参);
}
看到这里可能有点抽象,接下来写一个具体的方法:两个整数相加
public class TestDemo {
// 方法定义
public static int Add(int x,int y){
int sum = x+ y;
return sum;
}
public static void main(String[] args) {
//方法的调用
Add(10,20);
System.out.println(Add(10,20));
}
}
注意事项
1.方法定义时, 参数可以没有。每个参数要指定类型
2.方法定义时, 返回值也可以没有, 如果没有返回值, 则返回值类型应写成 vo
3.方法定义时的参数称为形式参数(形参),方法调用时的参数称为实际参数(实参)
4.方法的定义必须在类之中, 代码书写在调用位置的上方或者下方都可以
5.所有程序的入口:main函数
形参与实参的关系
首先我们写一个交换两个数的方法,并运行一下
public class Test1 {
public static void swap(int a,int b){
int temp = a;
a = b;
b = temp;
}
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("交换实参前:"+a+" "+b);
swap(a,b);
System.out.println("交换实参后:"+a+" "+b);
}
}
为什么没有发生任何改变呢?
因为我们交换的是形参,而不是交换的实参。如果要交换实参,我们应该拿到a和b的地址,但是!a和b在main函数中,函数里的变量属于局部变量,存放在栈上。但是在Java中,拿不到栈上的地址,所以a和b的实际值并没有发生改变。如果要交换a和b的值,只能把a和b的值放在堆上(放在堆上的都是对象!!)
二.方法的重载
1.重载的作用
前面我们提到了方法需要参数类型,但是如果我们需要用一个函数同时兼容多种参数的情况应该怎么办呢? 这里就可以使用到方法重载
在我们写了一个add方法后,如果我们想用这个方法计算double类型的时候,会出现类型不兼容的问题,那么我们应该怎么解决呢?或许可以像下面这样
public class Test2 {
public static int addInt(int a, int b){
int sum = a+b;
return sum;
}
public static double addDouble(double a,double b){
double sum = a+b;
return sum;
}
public static void main(String[] args) {
double a = 10.5;
double b = 20.5;
addDouble(a,b);
System.out.println(addDouble(a,b));
}
}
这种写法不存在任何问题,例如在go语言中就这样使用,但是Java认为addInt这种名字不太好,不如直接叫add,这就有了如下写法
public class Test2 {
public static int add(int a, int b){
int sum = a+b;
return sum;
}
public static double add(double a,double b){
double sum = a+b;
return sum;
}
public static void main(String[] args) {
double a = 10.5;
double b = 20.5;
add(a,b);
System.out.println(add(a,b));
}
}
运行起来也没有任何问题,这就是重载的作用!能解决参数类型不匹配等问题。比如add方法,你还能添加更多版本的使用,比如多个数相加...
同一个方法名字, 提供不同版本的实现,称为方法的重载
2.重载的使用规则
针对同一个类:
1.方法名相同
2.方法的参数不同(参数个数或者参数类型)
3.方法的返回值类型不影响重载
4.当两个方法的名字相同, 参数也相同, 但是返回值不同的时候, 不构成重载。比如int add(int a,int b)和double add(int a,int b)
三.方法的递归
1.递归的概念
递归就是方法调用自己的过程。实现递归,需要去推导出递归公式。
递归的前提:有一个趋近于终止的条件、自己调用自己
递归的关键:就是要找到递归公式!理解"递"和"归"的过程
2.递归执行过程分析
public class Test3 {
public static int fac(int n){
if(n==1){
return 1;
}
int temp = n*fac(n-1);
return temp;
}
public static void main(String[] args) {
System.out.println(fac(3));
}
}
具体过程分析:
3.递归练习
相信看到这里,你对递归也有了一定的认识,可以适当练习一些题增加熟练度。附上笔者的答案,如有错误,请斧正!
1.按顺序打印一个数字的每一位
按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)
public class Demo1 {
public static void print(int n){
if(n>9){
print(n/10);
}
System.out.print(n%10+" ");;
}
public static void main(String[] args) {
int n = 1234;
print(n);
}
}
2.递归求 1 + 2 + 3 + ... + 10
递归求 1 + 2 + 3 + ... + 10
public class Demo2 {
public static int func(int n){
if(n!=0){
n += func(n-1);
}
return n;
}
public static void main(String[] args) {
System.out.println(func(10));
}
}
3.返回组成它的数字之和
写一个递归方法,输入一个非负整数,返回组成它的数字之和. 例如,输入 1729, 则应该返回1+7+2+9, 它的和是19
public class Demo3 {
public static int func(int n){
if(n<10){
return n;
}
return n%10+func(n/10);
}
public static void main(String[] args) {
System.out.println(func(1792));
}
}
4.求斐波那契数列的第 N 项
解法一:使用递归,时间复杂度为O(2^n),空间复杂度为O(n)
public class Demo4 {
public static int fib(int n){
if(n==1 || n == 2){
return 1;
}else{
return fib(n-1)+fib(n-2);
}
}
public static void main(String[] args) {
System.out.println(fib(1));
System.out.println(fib(2));
System.out.println(fib(3));
System.out.println(fib(4));
System.out.println(fib(123456));
}
}
但是这种解法效率并不高,再计算较大数字时就会明显出现停顿,因为它会进行很多重复的运算,于是我们可以用循环写这个代码,也叫迭代解法
解法二:使用迭代,时间复杂度为O(n),空间复杂度为O(1)
public class Demo4 {
public static int fib2(int n){
if(n==1 || n==2){
return 1;
}
int f1 = 1;
int f2 = 1;
int f3 = 0;
for (int i = 3; i <= n; i++) {
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
return f3;
}
public static void main(String[] args) {
System.out.println(fib2(1));
System.out.println(fib2(2));
System.out.println(fib2(3));
System.out.println(fib2(4));
System.out.println(fib2(40));
}
}
来源:https://blog.csdn.net/weixin_55752048/article/details/120995758
猜你喜欢
- 过滤器实现过滤器需要实现 javax.servlet.Filter 接口。重写三个方法。其中 init() 方法在服务启动时执行,destr
- 一 :问题背景问题:当查询接口较复杂时候,数据的获取都需要[远程调用],必然需要花费更多的时间。 假如查询文章详情页面,需要如下标注的时间才
- springboot + docker + jenkins自动化部署项目,jenkins、mysql、redis都是docker运行的,并且
- timer和timertask是jdk自带的定时任务实现,无需导入第三方jar包来完成1、指定多久之后执行此任务,注意:只会执行一次publ
- 简单工厂简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。定义了一个创建对象的类,由
- 项目场景:适用于接口数据敏感信息,比如 明文传输姓名、居住地址、手机号等信息,如果存在明文传输敏感数据问题、及数据泄漏风险,则可使用此方法加
- 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的
- 最近在做项目的时候有用到对两个集合中的元素进行对比求其交集的情况,因为涉及到的数据量比较大,所以在进行求两个集合中元素交集的时候,就应该考虑
- tcp客户端示例#include <errno.h> #include <sys/socket.h> #includ
- 什么是注解在早期的工作的时候 ,自定义注解写的比较多,可大多都只是因为 这样看起来 不会存在一堆代码耦合在一起的情况,所以使用了自定义注解,
- 1.获取签名与模板进入阿里云平台,进入短信服务模块,在以下位置添加签名和模板(格式一定按照要求填写 审批的比较严格)2.编写模板与签名的枚举
- 环境:VS2019+Qt5.121. CLR库安装 &nb
- 一、继承1、继承的概念继承机制:是面向对象程序设计是代码可以复用的最重要手段,允许程序员在保持原有类特性的基础上进行扩展,增加新的功能,产生
- java.sql.Timestamp(时间戳)继承父类:java.util.Date所有已实现的接口:Serializable, Clone
- 1、mybatis-plus @DS实现动态切换数据源原理首先mybatis-plus使用com.baomidou.dynamic.data
- 前言在Java System#exit 无法退出程序的问题一文末尾提到优雅停机的一种实现方案,要借助Shutdown Hook进行实现,本文
- 在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的、不可预知的异
- 前言回老家,实在太无聊,于是乎给自己整了一套台式机配置,总价 1W+,本以为机器到位后可以打打游戏,学学技术打发无聊的时光。但是我早已不是从
- 前言感觉Jpa的动态构建查询不好使用,然后mybatis-plus没有动态构建表的功能,有没有可能使两者混合使用,利用Jpa自动建表的优势
- Java并发包的locks包里的锁基本上已经介绍得差不多了,ReentrantLock重入锁是个关键,在清楚的了解了同步器AQS的运行机制后