Java—方法的使用(1)

System.out.println("计算 n 的阶乘中! n = " + n);

int result = 1;

for (int i = 1; i <= n; i++) {

result *= i;

}

return result;

}

以N!为例画图讲解

public static int fac(int n){

if(n==1){

return 1;

}

int tmp = n * fac(n-1);

return tmp;

}

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

int n = scanner.nextInt();

int y = fac(n);

System.out.println(y);

}

4,实参和形参的关系


代码示例: 交换两个整型变量

public static void main(String[] args) {

int a = 10;

int b = 20;

swap(a, b);

System.out.println("a = " + a + " b = " + b);

}

public static void swap(int x, int y) {

int tmp = x;

x = y;

y = tmp;

}

原因分析

刚才的代码, 没有完成数据的交换.

对于基础类型来说, 形参相当于实参的拷贝. 即传值调用

int a = 10;

int b = 20;

int x = a;

int y = b;

int tmp = x;

x = y;

y = tmp;

可以看到, 对 x 和 y 的修改, 不影响 a 和 b.

解决办法: 传引用类型参数 (例如数组来解决这个问题)

public static void main(String[] args) {

int[] arr = {10, 20};

swap(arr);

System.out.println("a = " + arr[0] + " b = " + arr[1]);

}

public static void swap(int[] arr) {

int tmp = arr[0];

arr[0] = arr[1];

arr[1] = tmp;

}

5,没有返回值的方法


方法的返回值是可选的. 有些时候可以没有的

代码示例

public static void main(String[] args) {

int a = 10;

int b = 20;

print(a, b);

}

public static void print(int x, int y) {

System.out.println("x = " + x + " y = " + y);

}

二,方法的重载

===========

1,重载要解决的问题


代码示例

class Test {

public static void main(String[] args) {

int a = 10;

int b = 20;

int ret = add(a, b);

System.out.println("ret = " + ret);

double a2 = 10.5;

double b2 = 20.5;

double ret2 = add(a2, b2);

System.out.println("ret2 = " + ret2);

}

public static int add(int x, int y) {

return x + y;

}

}

// 编译出错

//Test.java:13: 错误: 不兼容的类型: 从double转换到int可能会有损失

// double ret2 = add(a2, b2);

那么是不是应该创建这样的代码呢?

class Test {

public static void main(String[] args) {

int a = 10;

int b = 20;

int ret = addInt(a, b);

System.out.println("ret = " + ret);

double a2 = 10.5;

double b2 = 20.5;

double ret2 = addDouble(a2, b2);

System.out.println("ret2 = " + ret2);

}

public static int addInt(int x, int y) {

return x + y;

}

public static double addDouble(double x, double y) {

return x + y;

}

}

这样的写法是对的(例如 Go 语言就是这么做的), 但是 Java 认为 addInt 这样的名字不友好, 不如直接就叫 add

2,使用重载


代码示例

public static void main(String[] args) {

int a = 10;

int b = 20;

int ret = add(a, b);

System.out.println("ret = " + ret);

double a2 = 10.5;

double b2 = 20.5;

double ret2 = add(a2, b2);

System.out.println("ret2 = " + ret2);

double a3 = 10.5;

double b3 = 10.5;

double c3 = 20.5;

double ret3 = add(a3, b3, c3);

System.out.println("ret3 = " + ret3);

}

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;

}

方法的名字都叫 add. 但是有的 add 是计算 int 相加, 有的是 double 相加; 有的计算两个数字相加, 有的是计算三个数 字相加. 同一个方法名字, 提供不同版本的实现, 称为 方法重载。

3,重载的规则


针对同一个类也可以是不同类:

方法名相同

方法的参数不同(参数个数或者参数类型)

方法的返回值类型不影响重载.

代码示例

class Test {

public static void main(String[] args) {

int a = 10;

int b = 20;

int ret = add(a, b);

System.out.println("ret = " + ret);

}

public static int add(int x, int y) {

return x + y;

}

public static double add(int x, int y) {

return x + y;

}

}

// 编译出错

//Test.java:13: 错误: 已在类 Test中定义了方法 add(int,int)

当两个方法的名字相同, 参数也相同, 但是返回值不同的时候, 不构成重载

三,方法递归

==========

1,递归的概念


一个方法在执行过程中调用自身, 就称为 “递归”. 递归相当于数学上的 “数学归纳法”, 有一个起始条件, 然后有一个递推公式.

例如, 我们求 N! 起始条件: N = 1 的时候, N! 为 1. 这个起始条件相当于递归的结束条件. 递归公式: 求 N! , 直接不好求, 可以把问题转换成 N! => N * (N-1)!

代码示例: 递归求 N 的阶乘

public static int fac(int n){

if(n==1){

return 1;

}

int tmp = n * fac(n-1);

return tmp;

}

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

int n = scanner.nextInt();

int y = fac(n);

System.out.println(y);

}

2,递归执行过程分析


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;

}

3,递归练习


代码示例1 按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)

public static void print(int num) {

if (num > 9) {

print(num / 10);

}

System.out.println(num % 10);

}

代码示例2 递归求 1 + 2 + 3 + … + 10

public static int sum(int num) {

if (num == 1) {

return 1;

}

return num + sum(num - 1);

}

代码示例3 写一个递归方法,输入一个非负整数,返回组成它的数字之和. 例如,输入 1729, 则应该返回1+7+2+9, 它的和是19

我的面试宝典:一线互联网大厂Java核心面试题库

以下是我个人的一些做法,希望可以给各位提供一些帮助:

整理了很长一段时间,拿来复习面试刷题非常合适,其中包括了Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新…可star一下!

image

283页的Java进阶核心pdf文档

Java部分:Java基础,集合,并发,多线程,JVM,设计模式

数据结构算法:Java算法,数据结构

开源框架部分:Spring,MyBatis,MVC,netty,tomcat

分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等

微服务部分:SpringBoot,SpringCloud,Dubbo,Docker

image

还有源码相关的阅读学习

image

负整数,返回组成它的数字之和. 例如,输入 1729, 则应该返回1+7+2+9, 它的和是19

我的面试宝典:一线互联网大厂Java核心面试题库

以下是我个人的一些做法,希望可以给各位提供一些帮助:

整理了很长一段时间,拿来复习面试刷题非常合适,其中包括了Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新…可star一下!

[外链图片转存中…(img-OUL1m7nR-1714332028277)]

283页的Java进阶核心pdf文档

Java部分:Java基础,集合,并发,多线程,JVM,设计模式

数据结构算法:Java算法,数据结构

开源框架部分:Spring,MyBatis,MVC,netty,tomcat

分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等

微服务部分:SpringBoot,SpringCloud,Dubbo,Docker

[外链图片转存中…(img-7NLEIKMI-1714332028278)]

还有源码相关的阅读学习

[外链图片转存中…(img-yloF6tie-1714332028278)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值