因为之前学过double 类型强转int是会丢小数部分的,所以想知道java里向上造型会不会丢失派生类的额外数据。
将测试直接强转类型,和通过添加进list转换类型,会不会丢
person类作为父类
package demo;
public class Person {
private String name;
{
name="init";
}
public Person() {
}
public Person(String s) {
this.name=s;
}
public String getName() {
return name;
}
}
student类作为子类,并多了status的额外变量
package demo;
public class Student extends Person{
private String status;
{
status="lost";
}
public Student(String s,String name) {
super(name);
this.status=s;
}
public Student() {
this("lost","init");
}
public String getStatus() {
return status;
}
@Override
public boolean equals(Object o) {
return true;
}
}
然后测试
package demo;
import java.util.ArrayList;
import java.util.List;
public class Main1 {
public static void main(final String [] args) {
List<Person> list=new ArrayList<>();
Person p1=new Person("p1");
Student p1_2=(Student)p1;
System.out.println("person->student"+p1_2.getStatus());
Student p2=new Student("还在","p2");
Person p2_1=(Person) p2;
Student p2_3=(Student) p2_1;
System.out.println("上溯造型"+p2_3.getStatus());
list.add(p2);
list.add(p1);
Student p2_2=(Student)list.get(0);
System.out.println("list上溯造型"+p2_2.getStatus());
}
}
运行结果是报错:
Exception in thread "main" java.lang.ClassCastException: demo.Person cannot be cast to demo.Student
at demo.Main1.main(Main1.java:11)
说明从Person转到Student是违法的
把那两行注释掉
package demo;
import java.util.ArrayList;
import java.util.List;
public class Main1 {
public static void main(final String [] args) {
List<Person> list=new ArrayList<>();
Person p1=new Person("p1");
// Student p1_2=(Student)p1;
// System.out.println("person->student"+p1_2.getStatus());
Student p2=new Student("还在","p2");
Person p2_1=(Person) p2;
Student p2_3=(Student) p2_1;
System.out.println("上溯造型"+p2_3.getStatus());
list.add(p2);
list.add(p1);
Student p2_2=(Student)list.get(0);
System.out.println("list上溯造型"+p2_2.getStatus());
}
}
运行结果:
上溯造型:还在
list上溯造型:还在
结论:强转数据类型,再强转回来并不会丢失数据,Person类型的list添加Student类个体,也不会丢失数据。