我想知道在什么情况下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;
}
}
答案 0 :(得分:0)
看物体时要考虑两件事:
这些是规则:
示例:
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)
您可以随时转换为“更多抽象类型”。例如从Student
到Person
。
在您的源代码中的任何地方,最好使用大多数抽象类型。主要原因是它允许更改实现而不必更改调用源代码或方法的签名。
例如,考虑将实现使用方式从HashMap更改为LinkedHashMap,而无需更改其他任何内容,因为您仅使用Map泛型类型。
即使允许使用较低的强制类型转换(您尝试过将Person
转换为Student
),也通常不建议这样做,并且通常意味着您的类设计中存在问题。
最后,由于它是一个runtime
操作,您将发现执行期间而不是compilation
时间是不可能的。