Day05—方法
1、成员方法
在程序开发中重复代码的定义,为了方便这些重复的代码,通过方法来保存,实现重复地调用。
访问修饰符 返回值数据类型 方法名(参数列表(数据类型 变量名1,数据类型 变量名2……){
方法体(程序)
[return;] //带返回值方法定义(定义时return后面的返回值与方法定义时的数据类型要匹配)
}
2、方法调用格式
(1)不带参方法的定义和调用
public class Test{
public static void main(String[] args){
//调用方法
isNumber();
}
//定义方法
public static void isNumber(){
int num = 10;
//判断10是否为偶数
if(num % 2 ==0){
System.out.println("true");
}else{
System.out.println("false");
}
}
}
(2)带参方法的定义和调用
public class Test{
public static void main(String[] args){
//常量值的调用方法
isNumber(10);
//变量值的调用方法
int num = 9;
isNumber(num);
}
//定义带一个参数的方法
public static void isNumber(int num){
//判断是否为偶数
if(num % 2 ==0){
System.out.println("true");
}else{
System.out.println("false");
}
}
}
(3)带返回值方法的定义和调用
public class Test{
public static void main(String[] args){
//1、方法名(参数)——一般没有意义,不推荐
isNumber(10);
//2、数据类型 变量名 = 方法名(参数);
boolean flag = isNumber(10); //判断完成后相当于 boolean flag = true
System.out.print(flag);
//System.out.print(isNumber(10)); 不要变量接收,直接输出,一般不推荐
}
//定义带返回值的方法
public static void isNumber(int num){
//判断是否为偶数
if(num % 2 ==0){
return true;
}else{
return false;
}
}
}
(4)方法特点
①方法必须先定义再调用,否则程序将报错。
②方法调用时,参数数量与类型必须与方法定义中的设置相匹配,否则程序将报错。
③方法不能嵌套定义。
④void表示无返回值,可以省略return,也可以单独书写return,后面不加数据。
⑤调用方法时,void类型的方法直接调用即可;非void类型的方法,推荐使用变量接收调用。
3、形参和实参
(1)形参
方法定义中的参数,等同于变量定义格式。
(2)实参:
方法调用中的参数,等同于使用变量或常量。
4、可变参数
public int method(int...data){ //调用时可以直接传递一个数组
int sum = 0;
for (int i = 0; i < data.length; i++) {
sum += data[i];
}
return sum;
}
public int method(String name,int age,int...data){ //在使用中,前两个参数必须传递,可变的参数根据需求进行传递
int sum = 0;
for (int i = 0; i < data.length; i++) {
sum += data[i];
}
return sum;
}
5、方法重载
(1)定义
方法名重用的一种技术形式。 一个方法不能满足要求,需要定义多个不同名称的方法。
(2)特点
在同一类中,方法名相同,参数的类型或个数不同,跟返回值没有关系。
public class Test{
public static void main(String[] args){
int result1 = sum(10,20);
System.out.print(result1);
int result2 = sum(10,20,30);
System.out.print(result2);
double result3 = sum(10.0,20.0,30.5);
System.out.print(result3);
}
//方法重载
public static int sum(int x,int y){
return x + y;
}
public static int sum(int x,int y,int z){
return x + y + z;
}
public static double sum(double x,double y,double z){ //doulbe --->int
return x + y + z;
}
}
6、方法的参数传递
(1)方法参数传递(基本数据类型)
形参的改变,不影响实参的值
public class Test3 {
public static void main(String[] args) {
int num = 100;
System.out.println("调用change方法前:"+num);
change(num); //形参的改变,不影响实参的值
System.out.println("调用change方法后:"+num);
}
public static void change(int num){
num = 200;
}
}
(2)方法参数传递(引用数据类型)
形参的改变,影响实参的值
public static void main(String[] args) {
int[] arr = {10,20,30};
System.out.println("调用change方法前:"+arr[1]);
change(arr); //形参的改变,不影响实参的值
System.out.println("调用change方法后:"+arr[1]);
}
public static void change(int[] arr){
arr[1] = 200;
}
7、方法的递归
是一种特殊方法嵌套调用形式,自己调用自己。是一层层带入,再一层层带出。
注意:
①递归调用必须有结束条件;
②每次调用的时候都需要改变传递的参数内容
③递归方法影响程序的性能,使用递推方式
//计算阶乘 1! + 2! + 3! + 4! + 5!
public class TestRecursion {
public int factorial(int num) { //实现阶乘的方法
if (num == 1) {
return 1;
}
return num * factorial(num - 1);
}
public int sum(int num){
if(num == 1){
return 1;
}
return factorial(num) + sum(num - 1); //5! + sum(4) 4! + sum(3)
}
public static void main(String[] args) {
TestRecursion testRecursion = new TestRecursion();
System.out.println(testRecursion.sum(5)); //153
}
}
8、构造方法
(1)定义
是一种特殊的方法,与类名相同,没有返回值 ,不能写void,写了void就变成普通方法了。
(2)作用
创建对象时给成员属性进行初始化。
访问修饰符 类名(参数列表){
构造方法体;
}
注意:
①构造方法在创建对象时被自动调用,当没有自己定义构造方法时,编译器会提供一个无参构造方法。
②一个类中至少要有一个构造方法。
③当定义了构造方法时,编译器不会再提供一个默认的无参数构造方法。