- 参考书:《Java语言程序设计与数据结构(基础篇)》—— 梁勇
一、概述
-
方法:就是
将一个功能抽取出来,把代码单独定义在一个大括号内,形成一个单独的功能
。 当我们需要这个功能的时候,就可以去调用。这样即
实现了代码的复用性
,也
解决了代码冗余
的现象。 - java中的方法,基本等价于C++中类的方法和C中的函数
二、定义一个方法
1. 格式
修饰符 返回值类型 方法名 (参数列表)
{
代码... //方法体
return x; //返回值
}
2. 说明
-
修饰符:
-
权限关键字:
private
/
public
/
protect
,类似C++(现在全写
public
即可,具体到对象和类的部分再说明) -
静态关键字:
static
,加上后定义的方法称为
静态方法
-
权限关键字:
-
返回值类型:
-
无返回值:
void
-
各种数据类型:
int、long、double、float、String...
-
无返回值:
-
方法名:为我们定义的方法起名,满足标识符的规范,用来调用方法
-
参数列表:这是
形式参数
的列表,调用时传入实际参数 -
返回值:方法末尾可以通过return返回一个数据,类型为函数头中声明的返回值类型。
若返回值类型是void,return可以省略,也可直接写
return;
不带返回值,从而提前退出方法
-
注意:方法必须定义在其他类中方法外,
不可嵌套定义
3. 示例
public static void methodName()
{
System.out.println("这是一个方法");
}
三、调用方法
1. 静态方法和动态方法
-
静态方法(有
static
修饰符):- 静态方法存储在在一个公共的内存地址,可以被这个类的所有对象访问。
- 类的静态方法和类的静态变量一样是在类加载的时候初始化的。
-
调用静态方法时
可以按常规方式
对象名.方法名
调用,也可以按
类名.成员名
形式调用,不需要创建对象
(最好使用后者,可以方便看出这是静态的)
-
动态方法/实例方法(无
static
修饰符):- 动态方法和对象实例存储在一起
-
动态方法在实例化对象的时候初始化,因此
静态方法不能调用动态方法
(因为调用的时候动态方法可能还没生成) -
调用动态方法前
必须创建对象,按
对象名.方法名
方式调用
2. 传参说明
-
调用时参数会尽量兼容,比如函数头为
public static void print(int i)
,调用时写
print('a')
,可以自动转换 -
java中参数传递方式
只有值传递一种
-
传入的是
基本数据类型
(
int/float/char...
):直接复制值,方法中修改形参不影响实参 -
传入的是
引用数据类型
(
String/数组/对象...
):引用数据类型存储的是真实数据的引用(可以看作地址),传参时同样复制实参的值,故形参存储了一个相同的引用。也如果在方法内通过形参修改其引用的对象本身,在方法退出后修改仍会保留;如果在方法内没有修改引用的对象,只是修改了形参(比如指向了其他对象),方法退出后修改不会保留
详细说明可参考:
为什么说Java中只有值传递
-
传入的是
四、重载方法
-
重载
允许你使用相同的名称定义不同的方法
,但是他们的参数列表必须不同 -
要求:
-
函数
名称必须相同
-
参数列表必须不同
(个数不同、类型不同、参数排列顺序不同等) -
函数的
返回类型可以相同也可以不相同
,仅仅返回类型不同不足以成为函数的重载 -
如果函数调用时可以匹配多个函数,会
匹配最精确的那个函数
,如果
两个函数一样精确,就会报错
max(int a,double b);
max(double a,int b);
调用
max(1,2)
时,因为上面两个函数一样精确,所以会报错
-
函数
-
使用重载方法,可以使使程序更清楚更有可读性。执行同样的功能的方法应当具有相同的名字,不管其参数类型是什么
五、变量的作用域
-
在方法中定义的变量称为
局部变量
,其
作用域从变量定义处开始,直到其所在的块末尾为止
。局部变量使用前必须要定义并赋值 - 方法的参数实际上就是一个局部变量,其作用范围涵盖整个方法
-
可以在一个函数内部的不同块(比如一个for循环体)里定义同名的局部变量
- 在内层,内层的同名变量会 ”遮住“ 外层的同名变量
- 在外层,内层的同名变量不可见