foreach,iterator一个可能不值一提小小区别

做PTA上面一个题的时候发现的:6-50 完成学生及教师的设计(包括集合) (20 分)

有发现foreach和iterator的小小区别请一定看到最后:

foreach在存储同父类元素的时候,会出现,不能准确分辨,遍历的当前元素到底是谁的对象(instanceof)

class MyTool {
    public static void separateStu_T(List persons, List teachers, List students) {
        //用foreach遍历
        for (Person person: persons) {//会报错
            //
                if(person instanceof Teacher) {
                    teachers.add((Teacher)person);
                }
                else if(person instanceof Student) {
                    students.add((Student)person);
                }
        }
        //用迭代器遍历的话
        Iterator<Person> iterator = persons.iterator();
        while(iterator.hasNext()) {
            Person person = iterator.next();
            if(person instanceof Teacher) {
                teachers.add((Teacher)person);
            }
            else if(person instanceof Student) {
                students.add((Student)person);
            }
        }
    }
}

报错图:

请添加图片描述

必须要将遍历元素全部向上转型为object才行,而这样的话就完全分辨不出谁是谁了;

而iterator遍历的话就不需要:

请添加图片描述

先看题干:

6-50 完成学生及教师的设计(包括集合) (20 分)

已知Main类、Person类的设计,完成Student类,Teacher类、MyTool类的设计。

函数接口定义

class Student extends Person{ }
class Teacher extends Person{ }
class MyTool{ public static void separateStu_T(List persons,List teachers,List students){}   }

Student类继承了Person,拥有私有属性int类型的sno和String类型的major,分别代表学号与所学专业;提供对应的set,get方法;比较方法完成按照学号比较。 Teacher类继承了Person,拥有私有属性int类型的tno和String类型的subject,分别代表教师编号与所授科目;提供对应的set,get方法;比较方法完成按年龄比较。 MyTool类中提供方法public static void separateStu_T(List persons,List teachers,List students){},方法 separateStu_T的功能是将persons线性表中的 teacher,student分别放到teachers,students两个线性表中

裁判测试程序样例:

import java.util.*;

public class Main {
    public static void main(String[] args) {

     List persons=getPersons();  //得到一个所有人的线性表

        List teachers=new ArrayList();
        List students=new ArrayList();

        MyTool.separateStu_T( persons,teachers,students); //将persons线性表中的 teacher,student分别放到teachers,students两个线性表中

        Collections.sort(teachers);  //对教师线性表排序
        Collections.sort(students);  //对学生线性表排序

        showResult(teachers);  //显示教师线性表排序以后的结果
        showResult(students);  //显示学生线性表排序以后的结果

    }

    public static List getPersons()
    {
        List persons=new ArrayList();

        Scanner in=new Scanner(System.in);
        Person person=null;

        int num=Integer.parseInt(in.nextLine());

        for(int i=0;i<num;i++)
        {    String str=in.nextLine();
            String []data=str.split(",");

            if(data[0].equalsIgnoreCase("student"))
                 person=new Student(Integer.parseInt(data[1]),data[2],data[3],Integer.parseInt(data[4]),data[5]);
            else if (data[0].equalsIgnoreCase("teacher"))
                  person=new Teacher(Integer.parseInt(data[1]),data[2],data[3],Integer.parseInt(data[4]),data[5]);
            else person=null;
                 persons.add(person);
        }
        return persons;
    }

    public static void showResult(List persons)
    {
        for(int i=0;i<persons.size();i++)
        {
            Person per=(Person)persons.get(i);
            System.out.println(per.getName()+","+per.getGender()+","+per.getAge());
        }
    }


}    



abstract class Person  implements Comparable
{    private String name;
     private String gender;
     private int age;


    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }


    public String getGender() {
        return gender;
    }


    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Person(String name, String gender, int age) {
        super();
        this.name = name;
        this.gender = gender;
        this.age = age;
    }


}
/* 请在这里填写答案 */

输入样例:

输入的第一行是总人数n,紧跟着输入n行,每一行代表一个人的信息。下面的例子中n=5,输入了5个人的信息。

5
student,1001,Tom1,female,18,computer
teacher,2001,Jake1,female,35,datastructer
student,1002,Tom2,male,19,computer
student,1003,Tom3,female,20,software
teacher,2002,Jake2,female,33,database

输出样例:

注意:本样例输出结果中两名教师是按照年龄升序排序的,三名学生是按照学号降序排序的。

Jake2,female,33
Jake1,female,35
Tom3,female,20
Tom2,male,19
Tom1,female,18
做题区:
class Teacher extends Person {
    int tno;
    String subject;

    public Teacher(int tno, String name, String gender, int age, String subject) {
        super(name, gender, age);
        this.subject = subject;
        this.tno = tno;
    }


    @Override
    public int compareTo(Object o) {
        return this.getAge() - ((Teacher) o).getAge();
    }
}

class Student extends Person {
    int sno;
    String major;

    public Student(int sno, String name, String gender, int age, String major) {
        super(name, gender, age);
        this.sno = sno;
        this.major = major;
    }

    public int getSno() {
        return sno;
    }

    public void setSno(int sno) {
        this.sno = sno;
    }

    @Override
    public int compareTo(Object o) {
        return ((Student) o).sno - this.sno;
    }

}

class MyTool {
    public static void separateStu_T(List persons, List teachers, List students) {
        //两种遍历都可以
        for (Object person: persons) {
                if(person instanceof Teacher) {
                    teachers.add((Teacher)person);
                }
                else if(person instanceof Student) {
                    students.add((Student)person);
                }
        }
     /*   Iterator<Person> iterator = persons.iterator();
        while(iterator.hasNext()) {
            Person person = iterator.next();
            if(person instanceof Teacher) {
                teachers.add((Teacher)person);
            }
            else if(person instanceof Student) {
                students.add((Student)person);
            }
        }*/
    }
}

等等刚刚运行起发现都能用,改成Object也能正确分辨出学生和老师!!!

主要是instanceof关键字在做这之前不是很深入了解

instanceof
instanceof是Java的一个保留关键字,左边是对象,右边是类,返回类型是Boolean类型。它的具体作用是测试左边的对象是否是右边类或者该类的子类创建的实例对象,是,则返回true,否则返回false。

instanceof使用注意事项
先有继承关系,再有instanceof的使用。
当该测试对象创建时右边的声明类型和左边的类其中的任意一个跟测试类必须得是继承树的同一分支或存在继承关系,否则编译器会报错。

例如

public class Application {

  public static void main(String[] args) {

    // Object > Person > teacher
    // Object > Person > Student
    // Object > String
    Object o = new Student(); // 主要看这个对象是什么类型与实例化的类名
    // instanceof关键字可以判断左边对象是否是右边类或者子类的一个实例
    System.out.println(o instanceof Student); // o 是Student类的一个实例对象 所以判断右边类跟student有无关系 以及显示声明有无关系
    System.out.println(o instanceof Person); // true
    System.out.println(o instanceof Object); // true
    System.out.println(o instanceof String); // false
    System.out.println(o instanceof Teacher); // 无关系
    System.out.println("========================");
    Person person = new Student();
    System.out.println(person instanceof Person); // true
    System.out.println(person instanceof Object); // true
    // System.out.println(person instanceof String); // 编译错误
    System.out.println(person instanceof Teacher); // 无关系

  }
}

instanceof 应用场景

需要用到对象的强制类型转换时,需要使用instanceof进行判断。

转载自

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兴趣使然的小小

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值