Java中如何在Classroom类调用Student类的getFirstName方法
Java跨类方法调用与代码错误修正
跨类调用方法是Java面向对象的基础特性,你的整体实现思路不存在偏差,运行异常全为代码细节问题导致。
现有代码的具体问题
- 方法调用语法错误:
getFirstName()是无参成员方法,你写的students.get(0).getFirstName缺少方法调用括号,且直接写属性名会优先匹配字段,而Student类的firstName是包私有权限,跨包场景会直接访问报错。 - 空指针异常触发:
Main里的studentArrayList被赋值为null,未实例化就调用add()方法,运行时会直接抛出NullPointerException。 - Classroom构造方法未赋值:构造方法接收了
studentArrayList参数,但没有把它赋值给类的成员变量this.students,传入的列表完全没有被存储。 getStudent方法设计缺陷:方法要求每次调用都传入列表,属于冗余设计;当前方法返回null,无法实现返回第一个Student对象的目标;同时入参的ArrayList未加泛型,会引发类型安全警告。- Student构造方法权限问题:Student的构造方法是包私有权限,如果后续三个类不在同一个包下,会直接无法实例化Student对象。
修正后的可运行代码
Student类
public class Student { // 字段设为私有做封装,权限更合理 private String firstName; // 构造方法改为public权限,跨包也可实例化 public Student(String firstName){ this.firstName = firstName; } public String getFirstName() { return firstName; } }
Classroom类
import java.util.ArrayList; public class Classroom{ // 成员变量存储本班学生列表 public ArrayList<Student> students; // 构造方法接收参数后赋值给成员变量 public Classroom(ArrayList<Student> studentArrayList) { this.students = studentArrayList; } // 无需额外传参,直接返回列表第一个Student对象 public Student getFirstStudent() { // 非空判断避免空指针 if (this.students == null || this.students.isEmpty()) { return null; } return this.students.get(0); } }
Main类
import java.util.ArrayList; public class Main { public static void main(String[] args) { Student a = new Student("John"); Student b = new Student("Jane"); // 先实例化ArrayList再操作,不能赋值为null ArrayList<Student> studentArrayList = new ArrayList<>(); studentArrayList.add(a); studentArrayList.add(b); Classroom c = new Classroom(studentArrayList); // 调用方法获取第一个Student对象,输出其姓名 Student firstStu = c.getFirstStudent(); System.out.println(firstStu.getFirstName()); // 预期输出John } }
内容的提问来源于stack exchange,提问作者Jon_belt
相关产品推荐
相关产品推荐

