1: 多态
多态时继承下面的产物,之所以存在向上向下转型的目的,就是解决参数传递的不变形,体现面向接口编程的重要性,
1.1 方法的多态性
①. 方法的重载:同一个方法名称可以根据参数的类型或个数不同调用不同的方法体。
②. 方法的覆写:同一个父类的方法,可能根据实例化子类的不同也有不同的表现形式。
1.2. 对象的向上转型
出现了父类指向了子类那么出现 向上转型 对象的向上转型:父类 父类对象 = 子类实例
class Person{ public void say() { System.out.println("我是Person"); } } public class Student extends Person { public void say() { System.out.println("我是Student"); } public void gotoSchool() { System.out.println("我的职责是上学"); } public static void main(String[] args) { // 向上转型 父类实例对象指向子类实例 只保留父类子类同名的方法,且子类变量覆盖父类变量 Person p=new Student(); p.say(); } }
输出: 我是Student
目的: 用于参数统一化,假设父类有n个子类,方法要接受子类的实例,如果没有向上转型,就需要定义n个方法接收不同的对象
1.3 对象的向下转型
对象的向下转型:子类 子类对象 = (子类)父类实例
class Person{ public void say() { System.out.println("我是Person"); } } public class Student extends Person { public void say() { System.out.println("我是Student"); } public void gotoSchool() { System.out.println("我的职责是上学"); } public static void main(String[] args) { // 向上转型 父类实例对象指向子类实例 只保留父类子类同名的方法,且子类变量覆盖父类变量 Person p=new Student(); p.say(); // 向下转型 子类实例指向父类 可以拥有子类自己的方法, Student s=(Student) p; s.say(); s.gotoSchool(); } }
注意: 向下转型之前一定要进行向上转型!!(让父类先指向子类)
否则在转型时会出现ClassCastException(类型转换异常–运行时异常)
问题: 如果向下转型存在安全隐患,那么如何转型才靠谱
class Person{ public void print() { System.out.println("我是人"); } public void p() { System.out.println("伤心的一天"); } } class Student extends Person{ public void print() { System.out.println("我是学生"); } public void fun() { System.out.println("开心的一天!"); } } public class Test{ public static void main(String[] args) { Person per = new Student(); //per是否能表示Person实例 System.out.println(per instanceof Person); //per是否能表示Student实例 System.out.println(per instanceof Student); if(per instanceof Student) { Student stu = (Student)per; stu.fun(); } } }
注意: 虽然增强了 程序的健壮性 但是,仅仅是这样,你还是需要 在这之前 进行 父类指向子类实例的过程 父类 父类对象 = 子类实例
1,4 扩展调用的例子
class Person{ public void print() { System.out.println("我是人"); } } class Student extends Person{ public void print() { System.out.println("我是学生"); } } class Worker extends Person{ public void print() { System.out.println("我是工人"); } } public class Test{ public static void main(String[] args) { whoAreYou(new Student()); whoAreYou(new Worker()); } public static void whoAreYou(Person per) { per.print(); } }