JAVA学习之多态篇(五)

本文是笔者学习JAVA的一些笔记。

Posted by 南三号 on August 27, 2017

多态=对象的多种形态

继承是多态的实现基础

一. 引用的多态

  • 父类的引用可以指向本类的对象
    Animal obj1=new Animal();
    
  • 父类的引用可以指向子类的对象
    //Dog类是Animal的子类
    Animal obj2=new Dog();
    //相当于你是一条狗,而你对外声明你是一个动物,而系统觉得你是一个动物,他就不会让你调用狗的方法
    //obj2是一个Dog类型的,可以调用与父类共有的属性和方法,但不能调用Dog类相对于父类【特有】的方法。
    

二. 方法的多态

即子类不满意父类的某个方法进行重写

//Animal中eat()方法
public void eat(){
    system.out.println("动物可以吃东西");
}
//Dog中eat()方法
public void eat(){
    system.out.println("狗喜欢骨头");
}
//定义两个对象
Animal obj1=new Animal();
Dog obj2=new Dog();
obj1.eat();//输出“动物可以吃东西”
obj2.eat();//输出“狗喜欢骨头”

三. 多态中的引用类型转换

  • 向上类型转换(隐式自动转换)(小类型到大类型)(无风险)
  • 向下类型转换(强制类型转换)(大类型到小类型)(有风险)
Dog dog=new Dog();
Animal animal=dog;//进行了向上转换
Dog dog2=(Dog)animal;//进行了向下类型强制转换,而直接Dog dog2=animal会报错。

//一二两句等价于:
Animal animal=new Dog();
  • instanceof方法(用来避免强制转换出现的问题)
//instanceof返回一个布尔值,使用方法:
<实例对象名> instanceof <类名>;
//意思:animal是不是Dog类型,是则返回true,否则返回false。
animal instanceof Dog;

四. 抽象类

abstract关键字 抽象类关注子类具有的特征,但不注重子类如何去实现。

应用场景

  • 在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法。
  • 从多个具有相同特征的类中抽象出一个抽象类作为这些类的父类(即模板),从而避免子类设计的随意性。

注意:

  • abstract可以定义抽象类也可以定义抽象的方法
  • 包含抽象方法的类必须是抽象类
  • 抽象类可以包含普通方法,也可以没有抽象方法
  • 抽象类不能直接创建(实例化),但可以定义引用变量。即引用的多态<父类的引用可以指向子类的对象>

使用方法:

public abstract class Animal(){
    abstract void eat();
}