理解面向对象特性之多态

简介: 多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。

何为多态


多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义

啥意思呢?就是说,在继承的基础上,一个父亲与多个儿子,父亲善于运动,儿子继承了父亲的特点,也善于运动,但是每个儿子各不相同,这样就体现了多种形态,可能大儿子善于跑步,二儿子善于跳高等等。

对面向对象来说,多态分为编译时多态运行时多态。其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。通过编译之后会变成两个不同的方法,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是大家通常所说的多态性

本质上来说,方法的重载就是多态的一种特别的体现!

多态优势


  • 消除类型之间的耦合关系
  • 可替换性
  • 可扩充性
  • 接口性
  • 灵活性
  • 简化性

多态存在的三个必要条件

  • 继承关系
  • 方法重写
  • 父类引用指向子类对象

父类引用指向子类,也就是这样:Parent p = new Child()也就是向上转型

演示

我们先创建了三个类

父类

//父亲
public class Father {
    public void Sports(){
        System.out.println("跑步");
    }
}

子类

//儿子一
public class Son1 extends Father {
    @Override
    public void Sports() {
        System.out.println("游泳");
    }
}
//儿子二
public class Son2 extends Father {
    @Override
    public void Sports() {
        System.out.println("跳高");
    }
}

测试类

入口(输出)类
public class Demo {
    public static void main(String[] args) {
        Father father = new Son1();
        father.Sports();
        //将对象更换成第二个儿子
        father = new Son2();
        father.Sports();
    }
}

看这个类,它new对象时,是通过Fathernew出了它其中的儿子类,Son1,而后,我调用了输出方法。

之后我跟换成第二个儿子,也调用输出方法。

结果

网络异常,图片无法展示
|

从这发现,它不是输出父类的方法,而是根据不同子类输出不同子类的方法

注意

我在子类添加一个方法,注意,父类没有相同方法,也就是说没有重写!!!

public class Son1 extends Father {
    @Override
    public void Sports() {
        System.out.println("游泳");
    }
    public void eat(){
        System.out.println("吃蛋白粉!");
    }
}

我们调用输出一下eat方法

网络异常,图片无法展示
|

转型

我们上面的方法是使用向上转型,相当于从小转大,不需要强转。

但是我如果想将小转到大呢?

我们可以这么写:子类类型 变量名=(子类类型) 父类类型的变量;

public class Demo {
    public static void main(String[] args) {
        Father father = new Son1();
        Son1 son1 = (Son1)father;
        son1.eat();
    }
}

这样我们就可以直接通过子类对象访问子类方法了。

判断

Java为我们提供一个关键字instanceof ,它可以帮助我们避免了ClassCastException 类型转换异常的发生。

变量名instanceof数据类型。

  • 如果变量属于该数据类型或者其子类类型,返回true。
  • 如果变量不属于该数据类型或者其子类类型,返回false。
相关文章
|
2月前
|
C++
C++ 是一种面向对象的编程语言,它支持对象、类、继承、多态等面向对象的特性
C++ 是一种面向对象的编程语言,它支持对象、类、继承、多态等面向对象的特性
|
2月前
|
Python
面向对象详解,面向对象的三大特征:封装、继承、多态-1
面向对象详解,面向对象的三大特征:封装、继承、多态
|
2月前
|
Python 容器
面向对象详解,面向对象的三大特征:封装、继承、多态-2
面向对象详解,面向对象的三大特征:封装、继承、多态
|
3月前
|
编译器 C++
[C++] 面向对象的三大特性:封装、继承和多态
[C++] 面向对象的三大特性:封装、继承和多态
61 0
|
11月前
|
存储 数据安全/隐私保护 Python
面向对象编程(OOP):理解类、封装性的关键概念
面向对象编程(OOP):理解类、封装性的关键概念
114 0
|
12月前
|
存储 编译器 C++
C++ 面向对象三大特性——多态
面向对象三大特性的,封装,继承,多态,今天我们研究研究C++的多态。
|
12月前
|
安全 Java 编译器
C++ 面向对象三大特性——继承
面向对象三大特性的,封装,继承,多态,今天我们研究研究C++的继承。
|
编译器 C++
【面向对象语言三大特性之 “多态”】(一)
【面向对象语言三大特性之 “多态”】(一)
58 0
|
编译器 Linux C++
【面向对象语言三大特性之 “多态”】(二)
【面向对象语言三大特性之 “多态”】(二)
66 0
|
安全 程序员
【面向对象语言三大特性之 “继承”】(一)
【面向对象语言三大特性之 “继承”】(一)
73 0