在学习Java多态性相关内容时,我一直不理解向上转型的意义,为什么要发生向上转型呢?
向上转型
定义:子类对象赋值给父类类型的变量,通俗地说就是是将子类对象转为父类对象
class Person{
public void print() {
System.out.println("人类");
}
}
class Student extends Person{
public void print() {
System.out.println("我是学生");
}
}
class Tea extends Person{
public void print() {
System.out.println("我是老师");
}
}
public class Test{
public static void main(String[] args) {
Person per=new Student();//向上转型
per.print();
}
}
首先,这是一个典型的向上转型的例子,Person per=new Student();在这里,new Student()相当于创建了一个Student类的对象,然后将这个对象赋值给父类类型的变量per,从而实现了将子类对象转换为了父类对象,同时,per调用的是子类的print()方法。
向上转型需要注意的地方
- 向上转型后,子类单独定义的方法会丢失(父类并不知道子类定义的新属性与方法)
- 父类引用可以指向子类对象,但是子类引用不能指向父类对象
- 如果子类中重写了父类的方法,那么调用这个方法的时候,将会调用子类中的方法
那么重点来了,向上转型的意义究竟是什么?
向上转型的意义
- 减少重复代码
- 实例化的时候可以根据不同的需求实例化不同的的对象,实现参数统一化
假如现在我们写一个getMessage()方法,用来接收不同子类的对象,然后调用它们的print()方法输出各个子类对象的相关信息,那么此时,有多少个子类,我们就需要写多少个方法,分别用来接收各个不同子类的对象
public void getMessage (Student stu) {
stu.print();
}
public void getMessage(Tescher ter) {
ter.print();
}
当我们使用了向上转型之后,就可以只写一个fun()方法来接收所有Person类的子类对象,这样就实现了参数的统一化
public void getMessage(Person per) {
per.print();
}