Java带参数的方法-2

简介: 实现思路及关键代码(1) 创建 CustomerBiz 类,添加属性姓名数组。(2) 创建 addName(String name) 方法,实现姓名的添加。(3) 创建 showNames( )方法,实现姓名的显示。(4) 创建测试类 TestCustomer, 实现循环,输入姓名。

实现思路及关键代码

(1) 创建 CustomerBiz 类,添加属性姓名数组。


(2) 创建 addName(String name) 方法,实现姓名的添加。


(3) 创建 showNames( )方法,实现姓名的显示。


(4) 创建测试类 TestCustomer, 实现循环,输入姓名。


参考解决方案


CustomerBiz 类的  addName(String name) 方法参考代码如下。

package cn.jbit.test1;
/*
 * 上机阶段1:实现客户姓名显示和添加
 *
 */
public class CustomerBiz {
    String[] names = new String[30];  // 姓名数组
    /*
     * 增加姓名
     * @param name要增加的姓名
     */
    public void addName(String name){
        for(int i =0;i<names.length;i++){
            if(names[i]==null){
                names[i]=name;
                break;
            }
        }
    }
    /*
     * 显示姓名
     */
    public void showNames(){
        System.out.println("**************************");
        System.out.println("\t客户姓名列表:");
        System.out.println("**************************");
        for(int i =0;i<names.length;i++){
            if(names[i]!=null){
                System.out.print(names[i]+"\t");
            }
        }
        System.out.println();
    }
}


TestCustomer 类实现循环输入,参考代码如下。

package cn.jbit.test1;
import java.util.*;
public class TestCustomer {
    public static void main(String[] args) {
        CustomerBiz cb=new CustomerBiz();
        boolean con=true;
        Scanner input = new Scanner(System.in);
        while(con){
            System.out .print("请输入客户的姓名:");
            String newName = input.next();
            cb.addName(newName);
            System.out .print("继续输入吗?(y/n):");
            String choice=input.next();
            if(choice.equals("n")){
                con=false;
            }
        }
        cb.showNames();
    }
}

上机练习2


指导——修改客户姓名


需求说明


修改学生姓名,输入新、旧姓名,进行修改并显示是否修改成功。

程序运行结果如图 14.2 所示。

                                                       图 14.2 上机练习 2 的运行结果


提示:在数组中查询到该客户,进行修改姓名。根据分析可以设计一个方法,通过传递两个参数(需要修改的姓名、新姓名)来实现。参考代码如下。


CustomerBiz 类的 方法参考代码如下。

package cn.jbit.test2;
/*
 *
 * 实现客户信息的管理
 *
 */
public class CustomerBiz {
    String[] names = new String[30];  // 客户姓名数组
    /*
     * 增加姓名
     * @param name要增加的姓名
     */
    public void addName(String name){
        for(int i =0;i<names.length;i++){
            if(names[i]==null){
                names[i]=name;
                break;
            }
        }
    }
    /*
     * 修改客户姓名
     * @param oldName旧名字
     * @param newName新名字
     */
    public boolean editName(String oldName,String newName){
        boolean find = false;  // 是否找到并修改成功标识
        // 循环数组,找到姓名为oldName的元素,修改为newName
        for(int i=0;i<names.length;i++){
            if(names[i].equals(oldName)){
                names[i] = newName;
                find=true;
                break;
            }
        }
        return find;
    }
    /*
     * 显示姓名
     */
    public void showNames(){
        System.out.println("**************************");
        System.out.println("\t客户姓名列表:");
        System.out.println("**************************");
        for(int i =0;i<names.length;i++){
            if(names[i]!=null){
                System.out.print(names[i]+"\t");
            }
        }
        System.out.println();
    }
}


TestModify 类实现循环输入,参考代码如下。


package cn.jbit.test2;
import java.util.Scanner;
public class TestModify {
    public static void main(String[] args) {
        CustomerBiz st = new CustomerBiz();
        Scanner input = new Scanner(System.in);
        for(int i=0;i<5;i++){
            System.out.print("请输入客户姓名:");
            String newName = input.next();
            st.addName(newName);
        }
        st.showNames();
        System.out.print("\n请输入要修改的客户姓名:");
        String oldname = input.next();
        System.out.print("请输入新的客户姓名:");
        String newname = input.next();
        System.out.println("\n*****修改结果*****");
        if(st.editName(oldname, newname)){
            System.out.println("找到并修改成功!");
        }
        else{
            System.out.println("没找到该客户!");
        }
        st.showNames();
    }
}


14.2 深入理解带参方法

14.2.1 数组作为参数的方法

问题:有五位学员参加了 Java 知识竞赛的决赛,输出决赛的平均成绩和最高成绩。


分析:将多个类型相同的数值型数据存储在数组中,并对其求总和、平均值、最大值、最小值等是实际应用中常见的操作,可以设计求总和、平均值、最大值、最小值等的方法,并把数组作为参数,这样便可以在多种场合下调用这些方法,如示例 4 所示。


示例4


package cn.jbit.classandobject;
/**
 *
 * 实现学生信息的管理
 *
 */
public class StudentsBiz {
   String[] names = new String[30];  // 学员姓名数组
   /**
    * 增加学生姓名
    * @param name要增加的姓名
    */
   public void addName(String name){
      for(int i =0;i<names.length;i++){
         if(names[i]==null){
            names[i]=name;
            break;
         }
      }
   }
   /**
    * 显示本班的学生姓名
    */
   public void showNames(){
      System.out.println("本班学生列表:");
      for(int i =0;i<names.length;i++){
         if(names[i]!=null){
            System.out.print(names[i]+"\t");
         }
      }
      System.out.println();
   }
   /**
    * 修改学员姓名
    * @param oldName旧名字
    * @param newName新名字
    */
   public boolean editName(String oldName,String newName){
      boolean find = false;  // 是否找到并修改成功标识
      // 循环数组,找到姓名为oldName的元素,修改为newName
      for(int i=0;i<names.length;i++){
         if(names[i].equals(oldName)){
            names[i] = newName;
            find=true;
            break;
         }
      }
      return find;
   }
   /**
    * 在一定区间查找学生姓名
    * @param start 开始位置
    * @param end 结束位置
    * @param name 查找的姓名
    * @return find 是否查找成功
    */
   public boolean searchName(int start,int end,String name){
      boolean find = false;  // 是否找到标识
      // 指定区间数组中,查找姓名
      for(int i=start-1;i<end;i++){
         if(names[i].equals(name)){         
            find=true;
            break;
         }
      }
      return find;
   }
    /**
     * 求平均分
     * @param scores 参赛成绩数组
     */
    public double calAvg(int[] scores){
        int sum=0;
        double avg=0.0;
        for(int i =0;i<scores.length;i++){
            sum+=scores[i];
        }
        avg=(double)sum/scores.length;
        return avg;
    }
    /**
     * 求最高分
     * @param scores 参赛成绩数组
     */
    public int calMax(int[] scores){
        int max=scores[0];
        for(int i =1;i<scores.length;i++){
            if(max<scores[i]){
                max=scores[i];
            }
        }
        return max;
    } 
}

示例 4 中的 StudentsBiz 类定义了两个方法,分别实现了求平均成绩和最高成绩,它们都是带数组参数并且带返回值的方法。


public double calAvg(int[] scores)


public int calMax(int[] scores)


参数 scores 数组传递所有学员的比赛成绩,而且定义方法时并没有指定数组大小,而是在调用方法时确定要传递的数组的大小。 return 语句用来返回平均成绩和最高成绩。


示例 4 的运行结果如图 14.3 所示。




图 14.3 示例 4 的运行结果


14.2.2 对象作为参数的方法

问题:在示例 1 中,实现了增加一个学生姓名的功能,那么,如果不仅要增加学生的姓名,还要增加学生的年龄和成绩,应该如何实现呢?


分析:在示例 1 中,设计了一个方法,通过传递一个参数(新增的学生姓名)来实现。同样,要新增年龄和成绩,可以在类中定义两个分别表示年龄和成绩的数组,同时在方法中增加两个参数(要新增的学生的年龄、要新增的学生的成绩)。但是,这样设计会有一些问题,在类中声明的数组较多,在方法中的参数较多,试想,如果新增的学生信息包括的更多,如家庭住址、联系电话、身高、体重、性别等,那么是不是需要在类中定义更多的数组和在方法中定义更多的参数呢?显然,这不是最好的解决方案。其实,大家已经学习过类和对象,可以使用面向对象的思想,把所有要新增的学生信息封装到学生类中,只需要在方法中传递一个学生对象就可以包含所有的信息,如示例 5 所示。


示例5


package cn.jbit.class4;
/*
 *
 * 学生类
 *
 */
class Student{
    public int id;
    public String name;
    public int age;
    public int score;
    public void showInfo(){
        System.out.println(id+"\t"+name+"\t"+age+"\t"+score);
    }
}
/*
 *
 * 实现学生信息的管理
 *
 */
public class StudentsBiz {
    Student[] students = new Student[30];  // 学生数组
    /*
     * 增加学生
     * @param 一个学生
     */
    public void addStudent(Student stu){
        for(int i =0;i<students.length;i++){
            if(students[i]==null){
                students[i]=stu;
                break;
            }
        }
    }
    /*
     * 显示本班的学生信息
     *
     */
    public void showStudents(){
        System.out.println("本班学生列表:");
        for(int i =0;i<students.length;i++){
            if(students[i]!=null){
                students[i].showInfo();
            }
        }
        System.out.println();
    }
}


相关文章
|
15天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
55 4
|
25天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
45 17
|
19天前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
44 2
|
27天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
19 3
|
27天前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
17 2
|
27天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
17 1
|
27天前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
33 1
|
27天前
|
Java
在Java多线程编程中,`wait()`和`notify()`方法的相遇如同一场奇妙的邂逅
在Java多线程编程中,`wait()`和`notify()`方法的相遇如同一场奇妙的邂逅。它们用于线程间通信,使线程能够协作完成任务。通过这些方法,生产者和消费者线程可以高效地管理共享资源,确保程序的有序运行。正确使用这些方法需要遵循同步规则,避免虚假唤醒等问题。示例代码展示了如何在生产者-消费者模型中使用`wait()`和`notify()`。
25 1
|
27天前
|
安全 Java 开发者
Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用
本文深入解析了Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用。通过示例代码展示了如何正确使用这些方法,并分享了最佳实践,帮助开发者避免常见陷阱,提高多线程程序的稳定性和效率。
34 1
|
6天前
|
Java
在Java中定义一个不做事且没有参数的构造方法的作用
Java程序在执行子类的构造方法之前,如果没有用super()来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用super()来调用父类中特定的构造方法,则编译时将发生错误,因为Java程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。
下一篇
无影云桌面