## 多态
~~~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();
}
}
}
~~~
- 课程开始
- 第一课20191008
- 第二课20191009
- HTML
- CSS
- CSS第一课
- CSS第二课
- CSS第三课
- CSS第四课
- CSS第五课
- JavaScript
- Js第一课
- Js第二课
- Js第三课
- Js第四课
- Js第五课
- Js第六课
- Js第七课
- Js-事件模型
- Js-2019-10-31-标准库
- Js-2019-11-01- 标准库
- Js-2019-11-01-Json
- Js-2019-11-01-对象的创建
- Js-2019-11-04-this的使用
- Js-2019-11-05-storage与异常
- Js-2019-11-05-BOM与补充知识点
- Js-2019-11-06-正则表达式和计时器
- jQuery
- jQuery-2019-11-13-初识jQuery
- jQuery-2019-11-14-jQuery节点操作
- jQuery-2019-11-15-jQuery节点操作二
- jQuery-2019-11-16-jQuery效果与动画
- Java
- Java-2019-11-27-变量直接量数据格式运算符
- Java-2019-11-28-流程控制
- Java-2019-12-02-数组
- Java-2019-12-04 面向对象
- Java-2019-12-05-封装
- Java-2019-12-06-深入构造器
- Java-2019-12-09-继承
- Java-2019-12-10-多态
- Java-2019-12-10-包装类
- Java-2019-12-11-final修饰符
- Java-2019-12-11-包装类
- Java-2019-12-11-接口
- java-2019-12-13-设计模式
- Java-2019-12-16-集合框架
- Java-2019-12-18-集合排序
- Java-2019-12-23-常用类学习
- Java-2019-12-25-异常处理
- Java-2019-12-31-内部类详解
