向上转型:就是把子类对象赋值给父类类型的变量。接下来用一个简单的例子来进行使用介绍:
创建父类
public class Person {
public String name = "this is a person";
public String sing(Person person){
return "person";
}
public String rap(){
return "rap";
}
}
创建子类
public class Student extends Person{
public String name = "this is a student";
@Override
public String sing(Person person){
return "override";
}
public String sing(Student student){
return "overload";
}
public String jump(){
return "jump";
}
}
测试类
public class Test {
public static void main(String[] args) {
//向上转型
Person p = new Student();
//直接调用父类独有的方法
System.out.println(p.rap());
//调用子类重写的方法
System.out.println(p.sing(p));
//通过向下转型调用子类重载的方法
System.out.println(((Student) p).sing((Student)p));
//通过向下转型调用子类独有的方法
System.out.println(((Student) p).jump());
//直接调用父类变量
System.out.println(p.name);
//通过向下转型调用子类变量
System.out.println(((Student) p).name);
}
}
控制台输出
rap
override
overload
jump
this is a person
this is a student
由以上结果可得:
向上转型创建的变量,直接调用的都是父类的方法和变量,若子类重写了父类的该方法,则会直接调用子类的方法,若想调用子类独有的方法和变量,可以通过向下转型实现调用。
之前查阅网上资料的时候,发现很多文章描述不太准确,把重写和重载(覆盖)都搞混了,有的直接写“同名方法”,重写和重载都是基于同名方法呀……所以这里顺便贴一下重写和重载的详细区别文章,供大家学习参考:https://blog.csdn.net/qq_38685503/article/details/113739437