第三章_Java中方法(封装)的基本概念和使用
1.方法的概念
方法是一个独立的可执行的单元。方法在一些语言中被称为函数,是对于一些重复使用的具有复杂逻辑的代码的封装,给被封装的代码起一个名字,并且可以随时通过这个名字调用被封装的代码。
为什么要定义方法?
假如有三个学生的成绩,需要计算他们每个人的总分。那么三个人的成绩我们就需要做重复的工作做三次,而方法的定义就是为了简化我们计算的过程,我们可以通过调用方法直接获取他们的总分,从而简化了一系列重复而又繁琐的工作。
eg:
姓名 | 语文 | 数学 | 总分 |
---|---|---|---|
张三 | 80 | 90 | 170 |
李四 | 80 | 80 | 160 |
王五 | 90 | 90 | 180 |
public class Test {
public static void main(String[] args) {
//把张三的成绩当做参数传入获取总分的方法
int zhangSan_Score = getSum(80, 90);
System.out.println("张三的成绩是:"+zhangSan_Score);
//把李四的成绩当做参数传入获取总分的方法
int liSi_Score = getSum(80, 80);
System.out.println("李四的成绩是:"+liSi_Score);
//把王五的成绩当做参数传入获取总分的方法
int wangWu_Score = getSum(90, 90);
System.out.println("王五的成绩是:"+wangWu_Score);
}
//定义一个获取总分的方法
public static int getSum(int chinese, int math) {
int sum = chinese+ math;
return sum;
}
}
执行效果:
总结
我们定义了一个获取总分的方法,省略了计算的过程,大大的节约了计算的时间。
2.定义方法的格式
2.1方法的定义格式
修饰符 返回值类型 方法名称(形参列表){
方法体代码; //就是一些可以执行某种功能的代码
return 返回值;//没有返回值的方法,这一步可以不写
//如果有返回值,返回值要与返回值类型相对应
}
2.2方法定义格式的解释
2.11.修饰符:
对于初学者来说,初学阶段只使用public static 就足够了
修饰符共分为4种,以下是对它们范围的排序
public > protected > default > private
2.1.2.返回值类型:
a.基本数据类型
b.引用数据类型
c.无返回值类型 :void
注:(void)关键字是方法的独有类型,只能在定义方法的时候使用,其他地方不能使用。
2.1.3.方法名称:
建议使用"小驼峰"命名,首个单词小写,建议使用动词
需要是合法字符,不能使用关键字命名
2.1.4.形参列表:
解释指接受的数据类型,形参列表中的格式,需要写 数据类型 + 变量名称
如果接受多个参数,使用逗号分隔
2.1.5.方法体代码:
方法内部执行的若干行代码,完成了某种功能的需求。
2.1.6.return:
结束方法的执行,并且将返回值返还给调用处。
2.1.7.返回值:
方法最终产生的结果数据。
总结
返回值必须和返回值类型对应。
参数如果有多个,需要使用逗号分隔。
参数如果没有,小括号则可以留空。
多个方法的定义先后顺序无所谓。
不能在一个方法内部定义方法。
方法定义之后,没有调用就不会执行;要想执行,一定要调用它。
2.3定义方法的标准
定义一个方法封装功能只要能明确以下两个标准,就能使我们根据业务需求定义一个逻辑清晰明了的方法。
2.3.1方法是否需要申明返回值类型
情景一(无返回值):假如我们仅仅需要拿到两个数的和,并且直接输出,那么就不需要返回值。返回值类型申明无:void
情景二(有返回值):假如我们拿到两个数的和之后,还需要使用和来进行其他的运算或者比较,这时候就需要申明方法的返回值,明确返回值的类型。
2.3.2方法是否需要申明形参列表?如果需要,则需要传递几个参数?
情景一(无形参列表):假如有两个已经确定的数需要求和,学生A,学生B,学生C都需要对这两个数进行计算,这时方法内部可以直接把和求出来让不同的学生来调用这个方法,这时就不需要再传递参数了。
情景二(有形参列表):假如我们需要计算随机两个数的和,那么这时候形参列表就需要传递两个参数,并且在传递的时候申明这两个参数的类型。
3.方法的调用方式
3.1有返回值方法的调用
a.输出调用
b.赋值调用
c.直接调用
代码演示:
public class Test {
public static void main(String[] args) {
//a.输出调用
System.out.println("输出调用method:"+method(10,20));//30
//b.赋值调用
int sum = method(2, 3);
System.out.println("赋值调用method"+sum);//5
//c.直接调用
/*
此处我们直接调用,没有输出语句所有控制空不会有数据产生
但是证明可以直接调用这个方法
*/
method(5,5);//10
}
//定义一个有返回值的方法
public static int method(int a, int b) {
int sum = a + b;
return sum;
}
}
执行效果:
3.2无返回值方法的调用
注:如果一个方法没有返回值,那么它只能直接调用。
代码演示:
public class Test {
public static void main(String[] args) {
// //输出调用
// System.out.println(method());
// //赋值调用
// int sum = method();
// System.out.println(sum);
//直接调用
method();
}
//定义一个有返回值的方法
public static void method() {
int a = 10;
int b = 20;
int sum = a + b;
System.out.println("和是:"+sum);
}
}
把报错的代码注释后的运行效果:
4.形参和实参的说明
由于方法中的参数提到了形参变量,在此处把形参变量和实参变量进行说明讲解。防止大家对参数变量概念的混淆。
4.1形参变量
用在方法的入口,方法入口定义的变量为形参变量。
简单来说就是方法名后的()中传递的变量。
4.2实参变量
在方法中定义的变量就是实参变量
简单来说就是定义方法时{}中,方法体代码中定义的变量,仅在当前方法内部有效。
代码解释:
public class Test {
public static void main(String[] args) {
String a = "实参变量";//a是实参变量
}
public static void method(String b){//b是形参变量
}
}
总结:
- 实参的作用范围,从定义开始到遇见的第一个 } 截止。
形参的作用范围从方法开始到该方法结束位置。
2.实参值通常可以传给方法的形参值。
3.实参变量通常需要给初始值,但是形参变量不能给初始值。
5.方法重载
5.1方法重载的概念
同一个类中,出现名称相同的多个方法,但是多个方法的形参列表不同,我们称为方法的重载。约定做同一件事,但是形参不同会执行不同的情况。
什么时候使用方法重载?
对于参数列表不一样的多个方法,如果设置不一样的方法名称会很麻烦,所以引入了方法重载(Overload)的技术。
5.2方法重载的前提条件
方法重载可以总结为2同1不同。
2同:同一个类中,方法名称必须相同
1不同 :形参列表必须不同
形参列表怎样才算不同?
类型不同,顺序不同,个数不同
方法重载代码演示:
public class Test {
public static void main(String[] args) {
}
//第一次定义method
public static void method(int a){
}
//改变方法的形参列表,重载method
public static void method(long b){
}
//改变方法的形参列表,重载method
public static void method(double c,String s){
}
//改变形参列表的顺序,重载方法
public static void method(String s,double c){
}
}
与方法重载无关的因素
1.与修饰词和返回值无关(只和方法名和形参列表有关)
2.与参数的名称无关,(如果参数类型和顺序一样,只修改参数名不属于方法重载)
如下图示例,这种特别被误认为是方法重载
6.方法的参数传递
6.1值传递
对于基本数据类型的变量,传递给方法的形参的时候,实际上传输的是变量的副本值;
不是变量本身,我们称为java的这一参数传递机制为:值传递
对于引用数据类型,引用数据类型的值传递 不改变地址,但是可以修改堆内存中的值。
代码演示:
public class Test {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
method(arr);
}
//定义method方法
public static void method(int[] arr){
arr[0] = 10;
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
执行效果:
解释:
我们把int类型的arr数组当做参数,传入method 方法中当做方法的形参变量。
其本质传输的是引用数据类型的地址值副本,因为地址值指向的是同一个对象,所以一方修改了地址中的数据,另一方看到的数据就是修改之后的。
6.2参数传递
形式参数:在“定义方法”的时候,写在小括号之内的变量,就叫形式参数。
实际参数:在“调用方法”的时候,真正传入方法里的数据,叫做实际参数。
总结
两条规则:
对于基本类型(以及String)来说,形式参数的操作【不会】影响实际参数。
对于引用类型(除了String)来说,形式参数的操作【会】影响实际参数。