NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
## 多态 ~~~java package com.dodoke.demo; public class Animal { protected String sex; protected int age; protected String color; protected String type; protected void sleep() { System.out.println("动物正在睡觉"); } /** * 动物叫 */ public void say() { System.out.println("动物叫"); } public Animal() { } public Animal(String type, int age) { this.type = type; this.age = age; } public Animal(String sex, int age, String color, String type) { super(); this.sex = sex; this.age = age; this.color = color; this.type = type; } } ~~~ ~~~java package com.dodoke.demo; public class Dog extends Animal { /** * 重写实际上针对父类的方法进行修改 * 通常会在重写的方法上加上注解 @Override * @param args */ @Override public void sleep() { System.out.println("狗正在躺着睡觉"); } /** * 重写say方法 */ @Override public void say() { System.out.println("汪汪汪"); } public void play() { System.out.println("狗正在玩"); } } ~~~ ~~~java package com.dodoke.demo; public class Cat extends Animal { /** * 重写say方法 */ @Override public void say() { System.out.println("喵喵喵"); } public void play() { System.out.println("猫正在玩"); } } ~~~ ~~~java package com.dodoke.demo; /** * 多态演示 * @author 一教室 * */ public class PolyStudy { public static void main(String[] args) { /** * 简单的继承和实例化对象 */ //数据类型 变量名 = new 数据类型构造器() Dog dog = new Dog(); dog.say(); Cat cat = new Cat(); cat.say(); //多态 Animal ani = null;//此时声明变量,确定编译的类型 ani = new Dog();//此时将调用构造器初始化出来的对象赋值给变量,确定运行时的类型 /** * 1. 创建一个Animal类型的变量anim变量 * 2. 在堆内存中开辟Dog类型的空间 * 3. 将Dog类型的空间地址赋给Animal类型的anim变量 */ //Animal car = new Car(); 编译时类型和运行时类型得是父类和子类的关系 //多态的测试 ani.say();//因为运行时类型为Dog,所以Animal类型的ani实际引用的say方法,为Dog类中重写的say方法 System.out.println("*******************"); //更换实现 ani = new Cat();//对ani重新赋值 ani.say(); } } ~~~ ~~~java package com.dodoke.demo; public class PolyStudy2 { public static void main(String[] args) { /** * 对象的转型 * 对象向上转型:子类对象->父类对象(由小变大)安全的 */ //实现多态,已经存在类型的转化了 Animal ani = new Dog(); ani.say(); ani.sleep(); //ani.play();引用变量ani只能调用它编译时类型Animal的方法,而不能调用其运行时类型Dog的方法 /** * 为什么要进行引用类型的强制类型转换 * 如果必须要调用对象ani运行时的类型Dog类中的方法,则需要进行强制类型转换。 */ /** * 对象的转型 * 对象向下转型:父类对象->子类对象(由大变小)不安全的 * 引用类型的强制类型转换 * 对象向下转型必须发生在向上转型之后,才能进行向下转型 */ //将Dog类型转变为Dog类型 if(ani instanceof Dog) { Dog dog = (Dog) ani;//将ani强制转变为Dog类型,编译时类型和运行时类型都变成了Dog类型 dog.say(); dog.play(); } /** * 将Dog类型转变为Cat类型 */ if(ani instanceof Cat) { Cat cat = (Cat) ani;//ani本质上是Dog类型,强制转变为Cat类型会发生错误 cat.play(); cat.say(); } } } ~~~