在Java中是否有一种投射对象的首选方法?

时间:2014-08-28 15:29:01

标签: java casting reference

我有一个超类人和一个子类学生。我已经制作了一个类型为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());

4 个答案:

答案 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());