---
title: Java方法
date: 2020-05-30 21:32:41
tags:
- Java
categories:
- Java基础
---

## 方法概述

Java方法是语句的集合，它们在一起执行一个功能。

* 方法是解决一类问题的步骤的有序组合
* 方法包含于类或对象中
* 方法在程序中被创建，在其他地方被引用

<!-- more -->

**设计方法的原则：**

方法的本意是功能块，就是实现某个功能的语句块的集合。我们设计方法的时候，最好保持方法的<span style="color:red">原子性，就是一个方法只完成1个功能，这样利于我们后期的扩展</span>。

**方法的命名规范：**

首字母小写和驼峰原则：run()，runRun()。

## 方法的定义及调用

### 方法定义

Java的方法类似于其它语言函数是一段用来完成特定功能的代码片段，一般情况下，定义一个方法包含以下语法：

<span style="color:red">方法包含一个方法头和一个方法体。</span>下面是一个方法的所有部分：

* <span style="color:red">修饰符</span>：修饰符，这是可选的，告诉编译器如何调用该方法。定义了该方法的访问类型。
* <span style="color:red">返回值类型</span>：方法可能会返回值。returnValueType是方法返回值的数据类型。有些方法执行所需的操作，但没有返回值。在这种情况下，returnValueType 是关键字void。
* <span style="color:red">方法名</span>：是方法的实际名称。方法名和参数表共同构成方法签名。
* <span style="color:red">参数类型</span>：参数像是一个占位符。当方法被调用时，传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的，方法可以不包含任何参数。
	* 形式参数：在方法被调用时用于接收外界输入的数据。
	* 实参：调用方法时实际传给方法的数据。
* <span style="color:red">方法体</span>：方法体包含具体的语句，定义该方法的功能。
* <span style="color:red">返回值</span>：如果返回值类型不为void，那么需要在方法体的最后return返回值，遇到return即结束方法。

```java
修饰符 返回值类型 方法名(参数类型 参数名){
	...
	方法体
	...
	return 返回值;
}
```

### 方法调用

调用方法：对象名.方法名（实参列表）

Java 支持两种调用方法的方式，根据方法是否返回值来选择。

* 当方法返回一个值的时候，方法调用通常被当做一个值。例如：

	```java
	int larger = max(20,30);
	```

* 如果方法返回值是void，方法调用一定是一条语句。

	```java
	System.out.println("Hello");
	```


## 方法重载

重载就是在一个类中，有相同的函数名称，但形参不同的函数。

**方法的重载的规则：**

* 方法名称必须相同。
* 参数列表必须不同（个数不同、或类型不同、参数排列顺序不同等）。
* 方法的返回类型可以相同也可以不相同。·仅仅返回类型不同不足以成为方法的重载。

**实现理论：**

方法名称相同时，编译器会根据调用方法的参数个数、参数类型等去逐个匹配，以选择对应的方法，如果匹配失败，则编译器报错。

## 命令行传参

有时候你希望运行一个程序时候再传递给它消息。这要靠传递命令行参数给main()函数实现。

```java
public class Demo03{
	public staticvoid) main(String args[]){
		for(int i = 0;i < args.length;i++){
			System.out.println("args["+ i +"]:"+args[i]);
        }
    }
}
```

![](https://i.loli.net/2020/05/30/ZSfx6b4NPU8Xdhe.png)

## 可变参数

JDK 1.5开始，Java支持传递同类型的可变参数给一个方法。

在方法声明中，在指定参数类型后加一个省略号（…）。

一个方法中只能指定**一个**可变参数，它必须是方法的**最后一个参数**。任何普通的参数必须在它之前声明。

```java
public static void printMax(double... numbers){
	if(numbers.length==0){
    	System.out.println("No argument passed");
    	return;
    }
    double result=numbers[0];
	//排序！
	for(int i = 1;i < numbers.length;i++){
		if(numbers[i]>result){
			result=numbers[i];
		}
    }
	System.out.println("The max value is "+result);
}
```

## <span style="color:red">递归</span>

A方法调用B方法，我们很容易理解

**递归就是：**A方法调用A方法！就是自己调用自己

利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解，递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算，大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。

**递归结构包括两个部分：**

* <span style="color:red">边界(递归头)</span>：什么时候不调用自身方法。如果没有头，将陷入死循环。
* <span style="color:red">递归体</span>：什么时候需要调用自身方法。

```java
public static int factorial(int n){
    if(n == 1){		//边界
        return 1;
    }else{
        n = n*factorial(n-1);	//递归
        return n;
    }
}
```

