演示向上造型
其实向上造型是多态的一种实现方式
- 父类(接口)的引用可以指向子类的对象,展现出来的是父类(接口)的功能
- 子类的引用变量可以指向子类的对象,展现出来的是子类的功能
子类对象可以展现出多态的实现
格式:
- 父类类型 变量名 = new 子类的对象();
- 接口名称 对象名 = new 实现类名称();
变量名.方法名() - 父类当中的
当多态出现以后,调用的方法是子类重写后的方法
多态的使用场景:
- 1.为变量复制的时候使用多态,达到父类的引用指向子类的对象,直接为变量赋值
- 2.调用方法的时候,为方法的参数进行赋值
3.方法的返回值,可以定义为父类的类型,但是返回的是子类的对象。当该方法被调用后,用父类的类型接收
多态的好处:
- 1.大大提高了程序的拓展性
- 2.提高了程序的复用性
解决造型异常的方案:
使用一个instanceof关键字来判断对象是不是属于这个类型
最后会返回true或者false,进行了对象的判断后就可以保证不出异常
父类 - 动物类:
/*** 父类 - 动物类** 用于展示多态的抽象方法*/package Test13_Demo.Demo08;/*@create 2020--12--01--15:15*/public abstract class Animal {//普通方法public void eat() {System.out.println("吃饭");}//抽象方法public abstract void sleep();}
狗类 - 子类(具体类):
/**** 狗类 - 子类(具体类)** 用于展示多态的实现* 再父类的共性功能外,有自己学习工作的方法*/package Test13_Demo.Demo08;/*@create 2020--12--01--15:17*/import Test13_Demo.Demo07.Animal;public class Dog extends Animal {@Overridepublic void sleep() {System.out.println("睡在地上");}//拓展子类自己的方法//工作的方法public void work() {System.out.println("千里无极,万里追踪");}//重写父类方法@Overridepublic void eat() {System.out.println("吃骨头");}}
人类 - 子类(具体类):
/**** 人类 - 子类(具体类)** 用于展示多态的实现* 再父类的共性功能外,有自己学习工作的方法*/package Test13_Demo.Demo08;/*@create 2020--12--01--15:17*/import Test13_Demo.Demo07.Animal;public class Person extends Animal {@Overridepublic void sleep() {System.out.println("睡在床上");}//拓展子类自己的方法public void study() {System.out.println("study");}//工作的方法public void work() {System.out.println("work");}//重写父类方法@Overridepublic void eat() {System.out.println("吃饭");}}
测试类:
/**** 演示向上造型** 其实向上造型是多态的一种实现方式* 父类(接口)的引用可以指向子类的对象,展现出来的是父类(接口)的功能* 子类的引用变量可以指向子类的对象,展现出来的是子类的功能* 子类对象可以展现出多态的实现** 格式:* 父类类型 变量名 = new 子类的对象();* 变量名.方法名() - 父类当中的** 当多态出现以后,调用的方法是子类重写后的方法** 多态的使用场景:* 1.为变量复制的时候使用多态,达到父类的引用指向子类的对象,直接为变量赋值* 2.调用方法的时候,为方法的参数进行赋值* 3.方法的返回值,可以定义为父类的类型,但是返回的是子类的对象。当该方法被调用后,用父类的类型接收** 多态的好处:* 1.大大提高了程序的拓展性* 2.提高了程序的复用性*/package Test13_Demo.Demo08;/*@create 2020--12--01--15:21*/import Test13_Demo.Demo07.Animal;import Test13_Demo.Demo07.Person;public class SubClassType {public static void main(String[] args) {//创建子类对象Person p = new Person();p.eat();p.sleep();p.work();p.study();//使用向上造型Animal a = new Person();//调用的父类中的方法,但是结果是子类中重写后的结果a.eat();a.sleep();/*a.work(); 调用不到*/System.out.println("---------拓展----------");//调用feed方法feed(new Person());//传入Animal的子类对象feed(new Dog());//传入Animal的子类对象/*feed(new Animal();//Animal是一个抽象类不能实例化*/}//封装一个方法,用于灵活的调用所有的方法 - 传入参数是一个父类public static void feed(Animal a) { //a是animal的引用,可以接收animal中所有的子类对象//调用该动物吃饭的方法System.out.println("feed方法内动物吃饭的方法被调用了");a.eat();}}
