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) 修饰符不同

全局变量可以加修饰符,局部变量不可以加修饰符

 

posted @ 2023-08-03 18:25  马铃薯1  阅读(13)  评论(0编辑  收藏  举报