多态中转型问题往往不容易理解,特别是向上和向下转型。
下面先说说多态的概念和前提:
1.要有继承关系;
2.要有方法重写;
3.要有父类引用指向子类对象;
如果是成员变量的话,编译看左边(父类),运行看左边(子类);
如果是成员方法的话,编译看左边(父类),运行看右边(子类);
如果是静态方法的话,编译看左边(父类),运行看右边(子类);
下面有一个例子可以说明:(输出结果为John和谈几个亿的大单子)
基本数据类型的自动提升和强制类型转换的区别:
从基本数据类型出发,其实就可以类似地可以得出,多态中的父类引用指向子类对象实际上就是向上转型;二也有多态向下转型;
向下转型的话就是要加上前面的转型符号;(我想了一下,还是从最简单的基本类型进行对比来看比较好)
public class Job {
public static void main(String[] args) {
System.out.println("我的工作是:");
}
public void say() {
System.out.println("工作");
}
}
先建一个job类,Job类的方法是say
再添加两个类,Teacher和Student,都继承Job;
public class Teacher extends Job{
public static void main(String[] args) {
System.out.println("老师");
}
}
public class Student extends Job{
public void say() {
System.out.println("学生");
}
}
最后再写个Test类来实例化调用
下面我们来测试下多态,父类指向子类具体实现
public class Test {
public static void main(String[] args) {
/*父类指向Student类的具体实现
* 由子类Student指向父类Job,向上转型
* */
Job job = new Student();
job.say();
/*向下转型
* 由Student转向job,按照提示添加在job前添加(Student)
* */
Student student = (Student) job;
student.say();
/*向下转型,因为job指向的是Student具体实现,
所以会报错*/
Teacher teacher = (Teacher) job;
teacher.say();
}
}