显式引用类型转换对Java有何帮助?

时间:2018-12-29 09:50:10

标签: java

我想知道在什么情况下Java参考转换会有所帮助?

我尝试了父类和子类,并验证了当父类对象被分配为子类的对象时,我们不需要任何强制转换。 但是相反,它不能像将父类的对象分配给子类的对象那样工作,它会给出编译时错误,例如“错误:不兼容的类型:无法将人转换为学生Student2 = person1;”

一旦我明确地强制转换了编译作品,但在运行时失败,并出现异常“ java.lang.ClassCastException:无法将人转换为Student”。我不明白强制转换是否在运行时无法正常工作,提供此功能的好处是什么,或者在任何情况下都可以正常工作并且有帮助。

class Person {

    private String name;

    Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

class Student extends Person {

    private int rollNo;

    Student(String name, int rollNo) {
        super(name);
        this.rollNo = rollNo;
    }

    public int getRollNo() {
        return rollNo;
    }
}
class Hello {

    public static void main(String[] args) {
        Person person1 = new Person("person1");
        Student student1 = new Student("student1", 11);
        tudent student2 = (Student) person1;

    }
}

2 个答案:

答案 0 :(得分:0)

看物体时要考虑两件事:

  1. 对象的编译时类型,即其声明的类型;
  2. 对象的运行时类型,即程序运行时实际上的类型。

这些是规则:

  1. 可以将声明为子类的对象分配给父类的引用;无需显式转换。
  2. 声明为父类的对象只有在运行时实际上是子类对象时才可以显式转换为子类。

示例:

private static void displayPerson(Person person) {
    System.out.println(person.name);
}

private static void displayStudent(Student student) {
    System.out.println(student.name + ": " + student.grade);
}

public static void main(String[] args) {
    Student student = new Student();
    displayPerson(student);  // rule 1

    Person student2 = new Student();  // declared type is Person, runtime type is Student
    displayStudent(student2);  // ERROR - won't compile
    displayStudent((Student) student2);  // rule 2 - cast is required
}

答案 1 :(得分:0)

您可以随时转换为“更多抽象类型”。例如从StudentPerson

在您的源代码中的任何地方,最好使用大多数抽象类型。主要原因是它允许更改实现而不必更改调用源代码或方法的签名。

例如,考虑将实现使用方式从HashMap更改为LinkedHashMap,而无需更改其他任何内容,因为您仅使用Map泛型类型。

即使允许使用较低的强制类型转换(您尝试过将Person转换为Student),也通常不建议这样做,并且通常意味着您的类设计中存在问题。

最后,由于它是一个runtime操作,您将发现执行期间而不是compilation时间是不可能的。