关于java.length问题,以及构造方法问题

请教一下,
1.为什么这里arr.length,会导致else里面的内容无法运行?
2.为什么我定义的构造方法getIndex(),通过在main方法里面调用之后会打印的是地址值,而不是数组里面存储的学生对象?

package com.itheima.aritheticoperator;

public class Test2 {
    /*创建一个长度为3的数组,存储1-3个学生对象作为初始化数据
        学生对象的姓名,学号各不相同。学生属性:学号,姓名,年龄
        1.再添加一个学生对象,并对一个学生对象进行唯一性判断
        2.添加完毕之后,遍历所有学生信息
        3.通过id删除学生对象,如果存在则删除,如果不存在则显示删除失败
        4.删除完毕之后,遍历所有学生信息
        5.查询数组id为“heima002”,如果存在,则年龄加一
        * */
    public static void main(String[] args) {
        Student[] arr = new Student[3];
        Student stu = new Student("张三", 1, 25);
        Student stu1 = new Student("李四", 2, 26);
        Student stu2 = new Student("春夜", 3, 27);
        arr[0] = stu;
        arr[1] = stu1;
        arr[2] = stu2;

        Student stu3 = new Student("赵虎", 4, 28);
        boolean falg=contains(arr,4);
        if(falg){
            System.out.println("当前id不存在");
        }else{
            int count=getcount(arr);
            if (count== arr.length){
                Student[] stu5=createNewArr(arr);
                stu5[count]=stu3;
                getIndex(stu5);
            }else{
                arr[count]=stu3;
                getIndex(arr);
            }
        }
    }
    public static void getIndex(Student[] arr){
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
    public static Student[] createNewArr(Student[] arr){
        Student[] newArr= new Student[arr.length+1];
        for (int i = 0; i < arr.length; i++) {
            newArr[i]=arr[i];
        }
        return newArr;
    }
    public static int getcount(Student[] arr){
        int count=0;
        for (int i = 0; i < arr.length; i++) {
            if(arr[i]!=null){
                count++;
            }
        }
            return count;
    }

    public static boolean contains(Student[] arr, int id) {
        for (int i = 0; i < arr.length; i++) {
            Student stu=arr[i];
            int sid= stu.getId();
            if(sid==id){
                return true;
            }
        }
        return false;
    }
}

chatgpt:
在你的代码中,arr.length并没有导致else里面的内容无法运行。根据你的代码逻辑,如果数组arr已满,即count==arr.length,就会新建一个长度比原数组多1的newArr数组,把原数组的元素复制到新数组中,然后再把新的学生对象添加到新数组中,并调用getIndex方法打印新数组中的所有学生对象。如果数组arr未满,就直接把新的学生对象添加到原数组中,并调用getIndex方法打印原数组中的所有学生对象。在这个逻辑下,如果数组arr已满,那么程序会执行if语句块里的内容,而不会执行else语句块里的内容,这可能是你误解了if-else语句的语法和逻辑。
getIndex方法并没有定义构造方法,它是一个自定义方法。在这个方法中,你通过for循环遍历了传入的数组,然后打印了每个学生对象。由于Java中的对象是引用类型,因此打印出的是每个学生对象的内存地址。如果你想打印学生对象的姓名、学号和年龄,可以在Student类中重写toString方法,返回一个包含这三个属性的字符串。例如:

public class Student {
    private String name;
    private int id;
    private int age;

    public Student(String name, int id, int age) {
        this.name = name;
        this.id = id;
        this.age = age;
    }

    // 重写toString方法
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", id=" + id +
                ", age=" + age +
                '}';
    }
}


然后在getIndex方法中调用每个学生对象的toString方法即可:

public static void getIndex(Student[] arr){
    for (int i = 0; i < arr.length; i++) {
        System.out.println(arr[i].toString());
    }
}


  1. 这是因为在判断数组是否满时,你使用了 arr.length 来判断数组长度,这个长度是固定的,一旦数组满了,就不会再执行 else 里的语句了,因为 else 的判断条件会一直为 false。所以你需要根据实际存储的学生数量来判断数组是否满了,而不是使用数组的长度。可以在 getcount() 方法中计算实际存储的学生数量,并在主函数中使用该方法来判断数组是否满了。
  2. Student类没有重写toString(),所以打印的是地址

1.因为你的count就是等于length所以无法进入else
2.如果Student没有重写toString方法,就会打印地址

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^