13-面向对象-可变参数和作用域
一、可变参数
1. 基本概念
Java允许将同一个类中多个同名同功能,但参数个数不同的方法,封装成一个方法,就可以通过可变参数实现。
2. 基本语法
访问修饰符 返回类型 方法名(数据类型... 形参名){
方法体;
}
public class VarParameter01 { public static void main(String[] args){ HspMethod m = new HspMethod(); int num1 = m.sum(1,2,3,4,5,6); System.out.println("可变参数: num1 = " + num1); } } class HspMethod{ //可以计算两个数的和,三个数的和,四,五... //可以使用方法重载 //两个数的和 public int sum(int n1, int n2){ return n1 + n2; } //三个数的和 public int sum(int n1, int n2, int n3){ return n1 + n2 + n3; } //四个数的和 public int sum(int n1, int n2, int n3, int n4){ return n1 + n2 + n3 + n4; } //上面的三个方法名称相同,功能相同,参数个数相同 --> 使用可变参数优化 //1. int... 表示可以接收的是可变参数,类型是int,即可以接收多个int(0-多) //2. 使用可变参数时,可以当作数组来使用,即 nums 可以当作数组 //3. 遍历 nums 求和即可 public int sum(int... nums){ System.out.println("接收的参数个数:" + nums.length); //遍历 nums 求和 int res = 0; for(int i = 0; i < nums.length; i++){ res += nums[i]; } return res; } }
3. 可变参数的注意事项和使用细节
a) 可变参数的实参可以为0个或任意多个
b) 可变参数的实参可以为数组
c) 可变参数的本质就是数组
d) 可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后
e) 一个形参列表中只能出现一个可变参数
练习题1. 有三个方法,分别实现返回姓名和两门课成绩(总分),返回姓名和三门课成绩(总分),返回姓名和五门课成绩(总分)。
封装成一个可变参数的方法(类名 HspMethod 方法名 showScore)
public class VarParameterExercise{ public static void main(String[] args){ HspMethod hm = new HspMethod(); //实现返回姓名和两门课成绩(总分) String res1 = hm.showScore("马铃薯1",80.0,85.5); System.out.println(res1); //实现返回姓名和三门课成绩(总分) String res2 = hm.showScore("马铃薯2",80.0,85.5,82.0); System.out.println(res2); //实现返回姓名和五门课成绩(总分) String res3 = hm.showScore("马铃薯3",70.0,75.0,80.0,85.0,90.0); System.out.println(res3); } } /** * * 有三个方法,分别实现返回姓名和两门课成绩(总分),返回姓名和三门课成绩(总分), * 返回姓名和五门课成绩(总分)。封装成一个可变参数的方法 * * 类名 HspMethod 方法名 showScore * * 思路分析: * 1. 形参列表(String, double...) * 2. 返回一个String * */ class HspMethod{ public String showScore(String name, double... scores){ //定义一个浮点型变量 totalScore,计算总的课程成绩 double totalScore = 0; for(int i = 0; i < scores.length; i++){ totalScore += scores[i]; } //返回一个String String res = name + "\t" + totalScore; return res; } }
二、作用域
基本使用
面向对象中,变量作用域时非常重要的知识点,相对来说不是特别好理解,主要就是全局变量和局部变量的作用域。
全局变量:全局变量又称为成员变量(属性),是指在类中定义的变量,作用域为整个类中有效。
局部变量:是指在方法体中定义的变量以及方法的参数,作用域只在定义它的方法内有效。
这里需要注意,全局变量可以不赋值直接使用,因为有默认值;局部变量必须赋值后才能使用,因为没有默认值。
public class Scope01{ public static void main(String[] args){ Cat cat = new Cat(); cat.cry(); cat.eat(); } } class Cat{ //全局变量,一般是在类中定义的变量 //age 的作用域在 Cat类中 int age = 10; public void cry(){ //局部变量,一般是在成员方法中定义的变量 //n,name 的作用域在 cry()方法中 int n = 10; String name = "马铃薯"; System.out.println("在cry()方法中使用属性 age = " + age); } public void eat(){ System.out.println("在eat()方法中使用属性 age = " + age); } }
作用域的注意事项和使用细节
a) 全局变量和局部变量可以重名,访问时遵循就近原则
b) 在同一个作用域中,比如在同一个成员方法中,两个局部变量不可以重名
c) 全局变量生命周期较长,伴随着对象的创建而创建,伴随着对象的死亡而死亡。局部变量生命周期较短,伴随着它的代码块执行而创建,伴随着代码块的结束而死亡。
d) 作用域不同
全局变量:可以被本类使用,或其它类使用(通过对象调用)
局部变量:只能在本类中对应的方法中使用
e) 修饰符不同
全局变量可以加修饰符,局部变量不可以加修饰符