方法
什么是方法?
方法就是一个功能模块的集合,将很多行代码放置在一组{}
中,制作成一个代码块,可以提高代码的复用性,减小代码实现的功能之间的关联性
为什么要使用方法
举例:
/*
在一些需求中,有些代码实际上是重复的,可以使用方法来对代码中相同的部分进行
比如:
1.输入一个数字,并将这个数字倒序输出
2.输入一个数字,判断这个数字是否是水仙花数
需求1思路:
1:将输入的数字逐个分离
2:将分离出来的数字通过乘以10^位-1从个位到最高位依次从新排列
3:将计算出来的数字相加得到目标值
需求2思路:
1:将数字逐个分离
2:分别计算出分离出来的每个数字的位数次幂
3:将2中计算的出来的结果相加
4:将最后得到的数字和初始的数字进行对比,判断该数字是否是水仙花数
*/
通过比较关键的思路步骤,不难发现其中的两个需求中对输入的数据的加工步骤是有共同点的,在这种情况下,可以用方法来将步骤分离,并通过调用方法来使用相应的步骤代码,达到降低程序代码耦合度,提高代码复用性的目的。
使用方法的好处
- 可以提高代码的复用性
- 可以提高后期代码的扩展性
- 可以提高后期代码的维护性
如何使用方法
1:方法的声明
- 位于类中,main方法外
- 声明格式
[修饰符] [static] {void|数据类型} 方法名称([参数列表])
{
执行语句;
}
public static void method(){
System.out.println("第一个方法");
}
- 使用
- 在main方法中通过方法的名称进行调用
public class Method01 {
public static void main(String[] args) {
method();
}
public static void method() {
System.out.println("第一个方法");
}
}
- 方法名称命名遵守标识符的命名规则,并且基本和变量名的命名规则一样
参数列表
1.完成两个数相加
public class Test{
public static void main(String[] args){
add();
}
public static void add(){
int a = 10;
int b = 20;
System.out.println("相加的和是"+(a+b);
}
}
其中add方法中的数字不能在main方法中改变,导致程序的复用性比较差;可以通过参数列表来完成
2.参数列表的使用
参数列表声明在方法名后的小括号中,可以声明0个或者是多个。
public class Test{
public static void main(String[] args){
add(10,20);
}
public static void add(int a,int b){
System.out.println("相加的和是"+(a+b);
}
}
-
参数列表的注意事项
- 将方法声明的参数列表称之为形式参数(简称形参)
- 对于调用的方法而言,传入的具体的参数的值是实际参数(简称实参)
- 方法声明的参数不需要初始化就可以使用,因为方法调用到之后一定会赋一个默认值
- 对于方法的调用者而言,在方法调用的时候不能只看方法名称,还需要相对应的实际参数列表,只有这样书写才能将方法正确调用。
- 在一个类中确定方法通过方法签名来完成 方法签名(方法名称+参数列表)
- 对于参数而言,具体的参数类型,个数,顺序都有一定的要求,要求取决于业务逻辑
3.变量的分类:
public class Test{
public static void main(String[] args){
int a = 10;
int b = 20;
add(20,30);
System.out.println(a+"==="+b);
}
public static void add(int a,int b){
System.out.println(a+"==="+b);
}
}
变量的三要素:变量类型,变量名,生命周期
按照变量声明的位置不同,将变量分为局部变量和成员变量
变量类型 | 声明方式 | 作用范围 | 注意事项 |
---|---|---|---|
成员变量 | 声明在类中,方法外的变量 | 当前类中有效 | 成员变量在声明之后都附有一个默认值(各种数据类型的0)在调用变量的时候,需要使用static修饰变量名或者创建一个对象来调用对象 |
局部变量 | 声明在方法中或者是代码块中,方法的参数列表是属于该方法的局部变量 | 当前{}中有效 | 一定要先声明赋值再使用 |
局部变量
局部变量就是定义在方法中或代码块中的变量,方法中的变量,局部变量的生命周期只有当前的代码块本身。
public class Test{
public static void main(String[] args){
{
int a = 10;
System.out.println("代码块内"+a);
}
System.out.println("代码块外"+a);
}
}
就代码块而言,也分多种的代码块:局部代码块、初始化块、静态代码块。
局部代码块:声明在方法中的代码块。局部代码块中声明的变量只能在当前局部代码快中有效。
局部代码块的优势:缩减了变量的生命周期;提高了内存的使用率,降低内存占用。
成员变量
声明在类中,方法外的变量称之为成员变量。
public class Overload {
int num ;
double a;
char ch;
boolean b;
String s;
public static void main(String[] args){
Overload o = new Overload();
System.out.println(o.num);
System.out.println(o.a);
System.out.println("-"+o.ch+"-");
System.out.println(o.b);
System.out.println(o.s);
}
}
成员变量要点:
- 成员变量可以不初始化就直接使用
- 成员变量的初始值是各种各样的0。
数据类型 | 整数型 | 浮点型 | 字符型 | 布尔型 | 引用类型 |
---|---|---|---|---|---|
初始值 | 0 | 0.0 | ’ ’ | false | null |
返回值
被调用的方法可以将自己最后的结果返回给调用处,方便后续的业务逻辑执行。返回值对于某些方法是极其有必要的。
- void:该方法没有返回值
- 一个方法可以不存在void,但是一定要有内容去填充void所在的位置
- 返回的数据的具体是什么类型,则通过该类型去代替void的位置
- 一个方法存在返回值,该方法的最后一行代码一定是return语句。
- 某个有返回值的方法执行完成之后,return的返回值会直接返回到该方法中,可以声明一个变量来接收该方法返回的值
public class Return{
public static void main(String[] args) {
add(3);
}
public static int add(int num) {
num = num +num;
System.out.println(num);
return num;
}
}
如何定义方法
- 方法的定义没有诀窍,只有多多练习,接收清晰的需求,方法就可以写出
- 方法的功能尽可能单一,否则容易导致代码臃肿,不利于后期维护
- 方法存在的目的是提高代码的复用性
- 对于方法而言最重要的就是返回值和参数列表
#### 方法的重载
在同个一类中,有两个以上的方法名称相同,但参数列表不同,该多个方法就称为重载
重载在代码编写执行过程中是有意义的,可以通过不同的返回值来对应调用不同的方法
public class Overload {
public static void main(String[] args) {
System.out.println(add(4,3));
System.out.println(add('a',3));
}
public static int add(int num1,int num2) {
int num = num1+num2;
return num;
}
public static int add(byte num1,int num2) {
int num = num1+num2;
return num;
}
public static int add(char num1,int num2) {
int num = num1+num2;
return num;
}
public static int add(int num1,char num2) {
int num = num1+num2;
return num;
}
}
重载的触发条件:同名方法的不同的参数列表(不同的参数类型,不同的参数数量,不同的参数顺序,三个条件满足一个即可)
注意:返回值类型和重载无关
方法重载的问题
- 执行方法调用时,一定要注意方法调用的原则是最近最优原则。先找一个完全能够匹配的被调用方法,如果不存在这个方法,则实际参数的数据类型会做自动类型提升,以期望可以找到一个最优的方法
- 自动提升的方式和数据类型的自动类型提升锋方式一致
- 一定不要让程序存在二义性,比如在程序中存在多个可以被调用的方法的时候,如果不存在一个完全匹配的方法,程序会报错