我有一个超类人和一个子类学生。我已经制作了一个类型为person的学生对象,并且想要调用在人类型中不存在的学生特定方法。我有两种方法可以做到这一点,我很想知道一种方法优于另一种方法,还是它们都达到了相同的结果?
Person newStudent = new Student("Scott", 22, "B22334952");
//method1: make a reference of newStudent and cast to Student
Student studentRef = (Student) newStudent;
System.out.println(studentRef.getUserId());
//method2: cast newStudent, but don't create a reference
System.out.println(((Student) student2).getUserId());
答案 0 :(得分:3)
他们都有相同的结果。
如果需要重用强制转换引用,则创建一个变量来存储强制转换的结果。
当你进行演员表演时,你正在为ClassCastException
做好准备,所以要时刻保持警惕。您可以在尝试演员之前检查类型
if (newStudent instanceof Student) {
Student studentRef = (Student) newStudent;
}
答案 1 :(得分:1)
两者都很相似。
如果您不想再使用该信息,请使用第二个。
答案 2 :(得分:1)
使用您喜欢的任何一种,这是一种毫无意义的微优化,并将产生等效的字节代码。您也可以使用Class.cast(Object)
之类的
System.out.println(Student.class.cast(newStudent).getUserId());
答案 3 :(得分:1)
最重要的是,不投光。转换意味着您的代码正在进行无法在编译时验证的假设,这是一个麻烦的方法。声明变量类型,捕获其值的完整要求和期望,并仅依赖于那些声明的类型。
所以,
// Declare a Student because a plain Person won't do
Student newStudent = new Student("Scott", 22, "B22334952");
System.out.println(newStudent.getUserId());