Java三大特性之--多态基础

发布时间 2023-08-09 21:09:27作者: 猫尾大闸蟹

半年前学的已经忘了,现在来复习一下。。。

1、多态的一个小例子

 

public class PolyObject {
public static void main(String[] args) {
//体验对象多态特点
//animal 编译类型就是 Animal , 运行类型 Dog
Animal animal = new Dog();
//因为运行时 , 执行到改行时,animal 运行类型是 Dog,所以 cry 就是 Dog 的 cry
animal.cry(); //小狗汪汪叫
//animal 编译类型 Animal,运行类型就是 Cat
animal = new Cat();
animal.cry(); //小猫喵喵叫
}
}

在这个例子中,cat和dog都继承了animal类,并且这三个类中都有各自的cry()方法

但是在运行的时候,我们将

Animal animal = new Dog();
然后执行
animal.cry();

那么,在这里,将执行dog.cry()

因为运行类型是dog,编译类型是animal。

2、向上转型和向下转型

 

/向上转型调用方法的规则如下:
//(1)可以调用父类中的所有成员(需遵守访问权限)
//(2)但是不能调用子类的特有的成员
//(3)因为在编译阶段,能调用哪些成员,是由编译类型来决定的
/(4)最终运行效果看子类(运行类型)的具体实现, 即调用方法时,按照从子类(运行类型)开始查找方法
//,然后调用
例子:
现在有个animal类,里面有睡、跑、吃、打招呼的方法
然后有一个cat类继承了animal类,并且重写了吃的方法(变成猫吃鱼),并且有猫自己特别的方法(猫抓老鼠)
那么:
//向上转型: 父类的引用指向了子类的对象
//语法:父类类型引用名 = new 子类类型();
Animal animal = new Cat();
Object obj = new Cat();//可以吗? 可以 Object 也是 Cat 的父类
animal.eat();//猫吃鱼..
animal.run();//跑
animal.show();//hello,你好
animal.sleep();//睡
在这里面,进行了向上转型,但仍然调用子类重写的方法(猫吃鱼),但是跑,打招呼和睡子类中都没有,所以调用父类的方法。
但是,不可以调用子类特有的方法。
如果需要调用,则需要向下转型
Cat cat = (Cat) animal;
cat.catchMouse();//猫抓老鼠
//多态的向下转型
//(1)语法:子类类型 引用名 =(子类类型)父类引用;

3、属性的值

多态的应用应该还是很多的,这个只是最基本,后面学到有再更新