前言:介绍 Java 中方法的基本语法、分类、执行并分析参数传值。
关键字:方法、形参、实参、返回值、实例方法、静态方法、参数传值
程序引例–为什么要「方法」
public class IntroduceOfMethod {
// 入口主方法。
public static void main(String[] args){
// 需求1:请编写程序,计算 100 和 200 的和
int x = 100;
int y = 200;
int z = x + y;
System.out.println(x + "+" + y + "=" + z);
// 需求2:请编写程序,计算666和888的求和。
int a = 666;
int b = 888;
int c = a + b;
System.out.println(a + "+" + b + "=" + c);
}
}
代码分析:需求 1 和需求 2 本质上相同,只是参与运算的数值不同,但是重复编写多行相似代码,复用性差。如果功能/业务逻辑相同,可以借助 Java 语言中的「方法」机制,简化程序。
方法
「方法」本质是一段代码片段,但这段代码重复使用以完成某个特定的功能。
方法定义在类体当中,一个类当中可以定义多个方法,方法定义没有先后顺序
方法体中不能定义方法
语法规则
[修饰符列表] 返回值类型 方法名([形式参数列表]){
方法体;
}
注意:
-
中括号 [] 中的内容不是必须的
-
方法体由 Java 语句构成
-
方法定义后被调用才能执行其中的语句,不调用是不会执行的
返回值
一个方法执行结束之后是需要返回执行结果的,而因为结果通常是一个具体存在的数据,所以被称为值或返回值。
返回值语句分为以下两种:
-
返回值是具体的数据,如:1、0.24、true等。返回值的数据类型须和方法定义中返回值类型一致
return 值;
-
方法没有返回值时,返回值类型为
void
,表示该方法执行结束后不返回任何结果return; // return语句所在的方法结束
关于返回值的常见报错:
- 当返回值类型不是
void
(表示方法运行结束后会返回一个具体的数据类型),然而方法运行之后却没有返回一个具体的数据类型 - 当返回值类型是
void
(表示方法运行结束后不会返回一个具体的数据类型),然而方法运行之后返回了一个具体的数据类型 - 缺少返回语句
返回值的接收
当方法有返回值时,可以选择是否不接收。若不接受,返回值仍会返回,只是因为无变量接收,返回后其内存会马上释放。若接收,
需使用变量接收方法的返回值,变量的数据类型与返回值类型保持一致,如:
int a = MethodTest03.sum(100, 200);
对于没有返回值的方法,不能用变量接收,否则收到报错:错误: 不兼容的类型: void无法转换为int
方法名
遵循标识符命名规范,首字母小写,后面每个单词首字母大写(驼峰命名方式);
见名知意,一般是动词。
形式参数列表(形参)
结构:
(数据类型1 变量名1, 数据类型2 变量名2, ……)
-
形参的数据类型起决定性作用,变量名只要求是合法的标志符。
-
形参的个数是:0~N个,多个形参间用逗号
,
隔开 -
形式参数列表中的每一个参数都是局部变量,方法结束之后其内存释放。
-
需要对每一个参数进行独立的数据类型声明。例如:
maxScore(int num1,int num2)
是正确的,而maxScore(int num1,num2)
是错误的。
public static void sumInt(){}
public static void sumInt(int x){}
public static void sumInt(int x, int y){}
public static void sum(int a, int b, double d, String s){}
实参参数(实参)
向被调用的方法传递的真实数据被称为实参。
实参和形参须一一对应:类型对应相同(类型不同可以进行数据类型转换),个数相同。
方法体
方法体当中编写的是业务逻辑代码,为了完成某个特定功能。
由 {}
括起,以 Java 语句构成;
遵循自上而下的顺序依次逐行执行
方法分类
根据修饰符列表中有无 static
可将方法分为实例方法和静态方法
实例方法
特点:修饰符列表中无 static
方法调用:必须先创建对象,再调用方法
引用数据类型 引用 = new 构造方法名();
实例方法名(实参);
使用情况:
-
如果方法描述行为必须由某个对象触发,那么应定义该方法为实例方法;
-
方法体中需直接访问实例变量,则应定义该方法为实例方法
静态方法
特点:修饰符列表中有 static
方法调用: 不需要new对象,直接调用
类名.静态方法名(实参);
负责调用的程序和被调用的方法在同一个类中,调用语句的 类名.
可以省略(类名省略默认从当前类中找方法),否则调用语句的 类名.
必须写
大部分情况下,为了调用方便,工具类中的方法都是静态的。
方法调用语句不一定要写在main方法中,只要是程序可以执行到的位置都可以调用方法
方法的执行
程序从 main 方法开始执行,main 方法由 JVM 自动调用的。
方法只有调用的时候才会执行,方法不调用是不会执行的。
注意:
在其他某些编程语言中,方法称为过程(procedure)或函数(function)。通常,带返回值的方法称为函数,返回值类型为void的方法称为过程。
定义方法和声明变量两者的细微差别:定义是指被定义的项目是什么,而声明通常是指为被声明的项目指明所属的类型(分配内存空间)
参数传值
Java 中关于方法调用时的参数传递规则:将变量中保存的值传过去,这个值可能是一个 Java 对象的地址值或字面值
例题1–字面值
注意两处 i
的输出。
public class Test1{
public static void main(String[] args){
int x = 100;
int y = x; // x赋值给y,是将x变量中保存的100这个值复制一份传给y
int i = 10;
add(i);
System.out.println("main ---> " + i); //10
}
public static void add(int i){ // i是局部变量,域是add()方法
i++;
System.out.println("add ----> " + i); //11
}
}
内存分析:
例题2–引用
注意两处 p.age
的输出
public class Test2{
public static void main(String[] args){
Person p = new Person(10);
add(p);
System.out.println("main--->" + p.age); //11
}
public static void add(Person p){
p.age++;
System.out.println("add--->" + p.age); //11
}
}
class Person{
int age;
//构造方法
public Person(int i){
age = i;
}
}