方法
大约 3 分钟
方法是用来解决一类问题的代码的有序组合,是一个功能模块
语法格式:
访问修饰符 返回类型 方法名(参数列表){ 方法体 }
main
:特殊的方法,程序执行的入口
访问修饰符
方法允许被访问的权限范围,分类如下,详细描述在
面向对象 - 封装
笔记文件里
- 不写修饰符
public
:公开的protected
:受保护的private
:私有的
分类
根据方法是否带参数、是否返回值,分为四类
无参无返回
// 打印星号分隔符
public class TestDemo {
public static void main(String[] args) {
TestDemo testDemo = new TestDemo();
testDemo.printStar();
}
public void printStar() {
System.out.println("*******************");
}
}
无参带返回
// 获取当前时间
import java.util.Date;
import java.text.SimpleDateFormat;
public class TestDemo {
public static void main(String[] args) {
TestDemo testDemo = new TestDemo();
System.out.println(testDemo.getCurrentTime());
}
public String getCurrentTime() {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 年-月-日 时-分-秒
String dateStr = sdf.format(date);
return dateStr;
}
}
带参无返回
// 打印矩形面积
public class TestDemo {
public static void main(String[] args) {
TestDemo testDemo = new TestDemo();
testDemo.printArea(4, 2);
}
public void printArea(float x, float y) {
System.out.println("矩形的面积为:" + x * y);
}
}
带参带返回
// 获取矩形面积
public class TestDemo {
public static void main(String[] args) {
TestDemo testDemo = new TestDemo();
float area = testDemo.getRectArea(4, 2);
System.out.println("矩形的面积为:" + area);
}
public float getRectArea(float x, float y) {
return x * y;
}
}
参数
传参类型
- 当参数是基本数据类型时,方法不能修改实际参数的值
- 当参数是引用类型时,方法通过地址引用改变了实际参数对象的内容
java
中只存在值传递,对于基本类型
、引用类型
均是如此,因此方法中对某个传递过来的参数进行赋值操作的时候,均不会影响原来的值 【参考文章】- 对于引用类型,直接在方法中修改了它的具体属性,外部会发生改变的原因是在
java
中引用类型的值是地址,在方法调用过程中,传递的是一份地址的拷贝,但是原引用和拷贝的引用依旧指向的是堆中的同一份值,因此,这份值做了改变,原来的对象本身就发生了变化
可变参数
允许在调用方法时传入不定长度的参数
实际上是 Java 的一个语法糖,本质上还是基于数组的实现
- 多个参数时,可变参数要放在参数列表的最后(一个方法中只能有一个可变参数)
- 当可变参数作为方法参数,方法调用时可以传入0个或多个参数,传入数组也可以。数组作为方法参数,方法调用时只能传入数组
// 求不定数量整数的和
public class TestDemo {
public static void main(String[] args) {
TestDemo testDemo = new TestDemo();
testDemo.sum(1);
testDemo.sum(1, 2);
testDemo.sum(1, 2, 3);
}
public void sum(int... n) {
int sum = 0;
for (int i : n) {
sum += i;
}
System.out.println(sum);
}
}
重载
方法名相同,参数列表不同的方法
- 同一个作用域下,并且方法名称相同
- 函数参数 类型不同 或者 个数不同 或者 顺序不同,与方法 参数名、返回值、访问修饰符 无关
- 可变参数作为参数的重载方法不会被优先调用