当前位置: 首页 > news >正文

医院 网站建设 中企动力东莞新闻最新消息今天

医院 网站建设 中企动力,东莞新闻最新消息今天,做网站的软件公司,网站建设 聊城目录 一、方法的概念及使用 1、什么是方法(method) 2、方法定义 3、方法调用的执行过程 4、实参和形参的关系 二、方法重载 1、为什么需要方法重载 2、方法重载概念 3、方法签名 三、递归 1、递归的概念 2、递归执行过程分析 一、方法的概念及使用 1、什么是方法(met…

 

目录

 

一、方法的概念及使用

1、什么是方法(method)

2、方法定义

3、方法调用的执行过程

4、实参和形参的关系

二、方法重载

1、为什么需要方法重载

2、方法重载概念

3、方法签名

 三、递归

1、递归的概念

 2、递归执行过程分析


一、方法的概念及使用

1、什么是方法(method)

方法就是一个代码片段. 类似于 C 语言中的 "函数"。方法存在的意义:
1. 是能够模块化的组织代码(当代码规模比较复杂的时候).
2. 做到代码被重复使用, 一份代码可以在多个位置使用.
3. 让代码更好理解更简单.
4. 直接调用现有方法开发, 不必重复造轮子.

2、方法定义

方法语法格式:
// 方法定义
修饰符 返回值类型 方法名称([参数类型 形参 ...]){
方法体代码;
[return 返回值];
}

为了更好得学会如何定义方法,我们来看几个实例:

示例一:实现一个函数,检测一个年份是否为闰年
public class Method{
// 方法定义
public static boolean isLeapYear(int year){
if((0 == year % 4 && 0 != year % 100) || 0 == year % 400){
return true;
}else{
return false;
}
}
}
示例二: 实现一个两个整数相加的方法
public class Method{
// 方法的定义
public static int add(int x, int y) {
return x + y;
}
}

那么我们在定义一个方法的时候要注意些什么呢?

注意事项:

1. 修饰符:现阶段直接使用public static 固定搭配
2. 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成 void
3. 方法名字:采用小驼峰命名
4. 参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开
5. 方法体:方法内部要执行的语句
6. java当中,方法必须写在类当中
7. java当中,方法不能嵌套定义
8. java当中,没有方法声明一说

3、方法调用的执行过程

在学完方法的定义后,我们接下来便是要学会如何调用方法,那么方法的调用过程是怎么样的呢?

方法调用过程】 

调用方法--->传递参数--->找到方法地址--->执行被调方法的方法体--->被调方法结束返回--->回到主调方法继续往下执行
为了更好地理解方法的本质,我们可以讲方法的定义、调用、执行理解为一个做菜的过程,那么这个过程大概是下面这个样子的

 那么方法有哪些注意事项呢?

1、定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行.
2、一个方法可以被多次调用.

4、实参和形参的关系

在我们学习C语言的时候,便了解过形参与实参之间的关系及其重要性,那么现在我们将学习在Java中实参和形参的关系

Java中方法的形参就相当于sum函数中的自变量n,用来接收sum函数在调用时传递的值的。形参的名字可以随意 取,对方法都没有任何影响,形参只是方法在定义时需要借助的一个变量,用来保存方法在调用时传递过来的值
比如:
public static int getSum(int N){ // N是形参
return (1+N)*N / 2;
}
getSum(10); // 10是实参,在方法调用时,形参N用来保存10
getSum(100); // 100是实参,在方法调用时,形参N用来保存100
public static int add(int a, int b){
return a + b;
}
add(2, 3); // 2和3是实参,在调用时传给形参a和b

在这两段代码中,都是将实参传递到方法中的实参内,通过方法完成运算并返回数值

在我们学习实参和形参的关系的时候,就不得不提一提经典案例:交换两个数的值

 

代码示例: 交换两个整型变量
public class TestMethod {
public static void main(String[] args) {
int a = 10;
int b = 20;
swap(a, b);
System.out.println("main: a = " + a + " b = " + b);
}
public static void swap(int x, int y) {
int tmp = x;
x = y;
y = tmp;
System.out.println("swap: x = " + x + " y = " + y);
}
}
// 运行结果
swap: x = 20 y = 10
main: a = 10 b = 20

我们可以发现,在swap函数交换之后,形参xy的值发生了改变,但是main方法中ab还是交换之前的值,即没有交换成功。这是为什么呢?

 

原因:
实参abmain方法中的两个变量,其空间在main方法的栈(一块特殊的内存空间)中,而形参xyswap方法中 的两个变量,xy的空间在swap方法运行时的栈中,因此:实参ab 与 形参xy是两个没有任何关联性的变量, swap方法调用时,只是将实参ab中的值拷贝了一份传递给了形参xy,因此对形参xy操作不会对实参ab
产生任何影响。

在C语言中,我们通过向函数传地址的方式来交换两个数的址,但是在Java中并没有地址这个概念,那么我们应该怎么做呢?

解决办法: 传引用类型参数 (例如数组来解决这个问题)
public class TestMethod {
public static void main(String[] args) {
int[] arr = {10, 20};
swap(arr);
System.out.println("arr[0] = " + arr[0] + " arr[1] = " + arr[1]);
}
public static void swap(int[] arr) {
int tmp = arr[0];
arr[0] = arr[1];
arr[1] = tmp;
}
}
// 运行结果
arr[0] = 20 arr[1] = 10

二、方法重载

1、为什么需要方法重载

我们先来看一段代码:

public class TestMethod {
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);
我们可以看到:由于参数类型不匹配, 所以不能直接使用现有的 add 方法.

当我们想求两个int类型的数相加的时候,我们可以定义一个方法add来完成,如果想要做到实现两个浮点型的数相加,我们也可以定义一个方法add2,由此类推,我们可以一直定义到addn,但是此时使用方法的程序员就遇到困难了,毕竟这么多功能相同但参数类型不同的方法,她该如何记住呢?

因此在Java中,便有了方法重载,利用方法重载,我们可以将所有功能为将数值相加的方法都命名为add,为程序员减少了很多不必要的工作量。

2、方法重载概念

在自然语言中,一个词语如果有多重含义,那么就说该词语被重载了,具体代表什么含义需要结合具体的场景。 在Java中方法也是可以重载的。
在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了
例如下面这段代码便是运用了方法重载:
public class TestMethod {
public static void main(String[] args) {
add(1, 2); // 调用add(int, int)
add(1.5, 2.5); // 调用add(double, double)
add(1.5, 2.5, 3.5); // 调用add(double, double, double)
}
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;
}
}

注意事项 :

1. 方法名必须相同
2. 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)
3. 与返回值类型是否相同无关
4. 编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法

3、方法签名

在同一个作用域中不能定义两个相同名称的标识符。比如:方法中不能定义两个名字一样的变量,那为什么类中就 可以定义方法名相同的方法呢?
方法签名即:经过编译器编译修改过之后方法最终的名字。具体方式:方法全路径名+参数列表+返回值类型,构成 方法完整的名字

 我们用一段代码来举例:

public class TestMethod {
public static int add(int x, int y){
return x + y;
}
public static double add(double x, double y){
return x + y;
}
public static void main(String[] args) {
add(1,2);
add(1.5, 2.5);
}
}
上述代码经过编译之后,然后使用JDK自带的javap反汇编工具查看,具体操作:
1. 先对工程进行编译生成.class字节码文件
2. 在控制台中进入到要查看的.class所在的目录
3. 输入:javap -v 字节码文件名字即可

  方法签名中的一些特殊符号说明:

 三、递归

1、递归的概念

一个方法在执行过程中调用自身, 就称为 "递归".
递归相当于数学上的 "数学归纳法", 有一个起始条件, 然后有一个递推公式
例如, 我们求 N!
起始条件: N = 1 的时候, N! 1. 这个起始条件相当于递归的结束条件.
递归公式: N! , 直接不好求, 可以把问题转换成 N! => N * (N-1)!

递归的必要条件:  

1. 将原问题划分成其子问题,注意:子问题必须要与原问题的解法相同
2. 递归出口

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

public static void main(String[] args) {
int n = 5;
int ret = factor(n);
System.out.println("ret = " + ret);
}
public static int factor(int n) {
if (n == 1) {
return 1;
}
return n * factor(n - 1); // factor 调用函数自身
}
// 执行结果
ret = 120

 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;
}
// 执行结果
函数开始, n = 5
函数开始, n = 4
函数开始, n = 3
函数开始, n = 2
函数开始, n = 1
函数结束, n = 1 ret = 1
函数结束, n = 2 ret = 2
函数结束, n = 3 ret = 6
函数结束, n = 4 ret = 24
函数结束, n = 5 ret = 120
ret = 120

关于 "调用栈"
方法调用的时候, 会有一个 "栈" 这样的内存空间描述当前的调用关系. 称为调用栈.
每一次的方法调用就称为一个 "栈帧", 每个栈帧中包含了这次调用的参数是哪些, 返回到哪里继续执行等信息.
后面我们借助 IDEA 很容易看到调用栈的内容.

通过上述代码,我们可以发现:递归大大地提升了代码的效率

 

http://www.khdw.cn/news/12617.html

相关文章:

  • 做网站还是订阅号深圳网络推广哪家公司好
  • 小程序模板做视频网站站长统计官方网站
  • 青岛网站建设公司 中小企业补贴百度搜索指数排名
  • 做网站跟做APP哪个容易太原seo计费管理
  • 美团网网站建设分析软文外链购买平台
  • 网站优化收费福建百度推广开户
  • 做网站要和企业logo软文营销写作技巧
  • 做照片的网站有哪些合肥网站排名提升
  • wordpress 4.2.1西安网站seo厂家
  • 做减肥网站百度网址链接是多少
  • 北京网站开发学习百度网站怎么提升排名
  • 网站建设 公司 天津知乎软文推广
  • 广西免费网站制作网络营销的渠道
  • 网站营销目标百度图片搜索入口
  • crm管理平台优化软件有哪些
  • 做小程序好还是做微网站好百度seo排名推广
  • 怎么做自己的手机网站佛山网站优化
  • dedecms网站搬家后登陆后台跳转后一片空白是怎么回事郑州seo使用教程
  • 青岛市疾病预防控制中心紧急提示国外搜索引擎优化
  • wordpress网站被攻击网址导航
  • 番禺网站建设哪里有网上接单平台有哪些
  • 淄博网站排名外包博客优化网站seo怎么写
  • 免费建造公司网站哈尔滨seo整站优化
  • 网站建设制作设计惠州网络推广营销方法
  • 医疗室内设计网站推荐网络营销的一般流程
  • 网站负责人核验现场拍摄照片电子件百度提交网址
  • wordpress修改注册邮件内容网站搜索引擎优化方法
  • 东莞人才网官方网站沧州网站运营公司
  • 做视频素材网站站长工具网站测速
  • wordpress英文版改中文seo排名优化表格工具