Java全面分析面向对象之多态

目录
  • 多态的理解
    • 向上转型
      • 向上转型的三种形式
      • 动态绑定和静态绑定
    • 方法的重写
  • 进一步认识和理解多态
  • 多态的优点

多态的理解

什么是多态呢??从字面理解就是多种形态,也就是不同类实例化出来的对象调用同一种方法,也可以理解为不同类的对象经过同一种行为产生的状态是不同的,这就是多态。

要想理解多态,我们必须要了解向上转型和重写这两个重点然后在来深刻理解多态这一概念,等看完向上转型与重写再来看多态的概念,你就会豁然开朗,一下就通透了不少。因为多态的条件就是向上转型,重写以及继承。

向上转型

首先多态的前提是继承,那既然是继承,那就肯定就有父类与子类这样的关系。

我们再来回忆一下怎么创建子类对象和父类对象。

class Animal{
    public String name;//名字
    public int age;
    public void eat() {
        System.out.println("我要吃饭!!!");
    }
    public void sleep() {
        System.out.println("我要睡觉!!!");
    }
}
class Cat extends Animal{
    public void mew() {
        System.out.println("喵喵喵!!!");
    }
}
public class TestDemo1 {
    public static void main(String[] args) {
         Cat cat =new Cat();//实例化子类对象
         cat.name="mimi";
         Animal animal = new Animal();//实例化父类对象
         animal.eat();
    }
}

这里就创建了猫这个类然后继承了Animal类。我们实例化猫和Animal这个对象就可以调用方法和属性。

那何为向上转型呢???

原本子类对象的引用引用子类的对象,现在让父类的引用引用子类对象这就是向上转型。

我们利用代码理解一下:

这就是向上转型,我们也可以利用animal这个父类引用 调用方法;

这时我们就会发现利用这个引用能够调用父类的方法和属性,但是不能够调用子类的方法和属性,那为什么呢??原因就是因为父类没有子类这个方法,所以不能调用。总结:向上转型的时候也就是父类引用引用子类对象,这个父类引用只能调用父类有的属性和方法,不能调用子类的。

向上转型的三种形式

第一种:直接赋值

也就是我们上面的那种写法:

  Animal animal1 = new Cat();//父类对象的引用 引用子类对象--->向上转型
  Animal animal2 = new Dog();

第二种:作为方法参数:

第三种作为返回值:

我们回到刚才的打印结果是什么;

但如果我把父类的方法变成我要吃猫粮呢?那结果毫无意外就是mimi我要吃猫粮。

但是这就会出现一个问题,如果我在创建一个狗类,然后在调用eat方法  难道狗也要吃猫粮么?这就会出现问题,那我们可以在子类写一个eat方法;

class Animal{
    public String name;//名字
    public int age;
    public void eat() {
        System.out.println(this.name+"要吃饭!!!");
    }
}
class Dog extends Animal{
    public void dark() {
        System.out.println("汪汪汪!!!");
    }
    public void eat() {
        System.out.println(this.name+"吃狗粮!!!");
    }
}
class Cat extends Animal{
    public void mew() {
        System.out.println("喵喵喵!!!");
    }
    public void eat() {
        System.out.println(this.name+"吃猫粮!!!");
    }
}
public class TestDemo1 {
    public static void main(String[] args) {
        //语法形式 : 父类 变量 = new 子类();
        Animal animal1 = new Cat();//父类对象的引用 引用子类对象--->向上转型
        Animal animal2 = new Dog();//父类对象的引用 引用子类对象--->向上转型
        animal1.name = "小猫";//访问父类属性
        animal2.name = "小狗";//访问父类属性
        animal1.eat();
        animal2.eat();
        // animal.mew();//访问子类特有的方法
    }
}

这时又创建了一个狗类,然后又分别在两个子类创建两个eat方法。

我们发现这时候就变得很清楚就达到我们想要的效果了。

但我们又应该想一想,为什么调用子类的eat方法而不调用父类的?

动态绑定和静态绑定

此时其实发生了动态绑定,我们可以看一下字节码文件,打开powershell窗口

我们都知道执行一个程序是先编译后运行,而这个是在编译的时候调用的是Animal的eat方法,而在运行的时候是调用的是Cat的方法这就是我们所说的运行时绑定或者可以说是动态绑定。

那既然有动态绑定那肯定也有静态绑定。

动态绑定是在编译的时候调用一个方法,而在运行时才是最后要确定调用的方法,也就是在运行时确定要调用那个方法。

静态绑定就是在编译期间已经确定要调用哪个方法。

其中,动态绑定最显著的代表就是方法重写。

静态绑定最显著的代表就是方法重载。

我们在回过头看上面的方法 ε=(´ο`*)))......怎么前面的eat方法返回值,参数列表,方法名都是一样的呢?我们来看一下。

方法的重写

我们之前学过方法重载这里回顾一下方法重载,方法重载是方法名相同,返回值不做要求,参数列表不同。而我们今天学的方法重写是返回值相同,方法名称相同,参数列表相同,说是叫方法重写其实也可以叫做方法覆盖。

方法重写有几点注意要求:

方法重写满足 方法名相同,方法的参数列表相同,方法的返回值相同。

我们也可以一键生成重写

有几个注意事项:

不能重写被private修饰的方法。

不能重写被final修饰的方法。

子类的方法的访问权限一定要大于等于父类的访问权限。

重写的方法, 可以使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验. 例如不小心将方法名字拼写错了 (比如写成eat), 那么此时编译器就会发现父类中没有 aet 方法, 就会编译报错, 提示无法构成重写.

被static修饰的方法也不能被重写

总结方法重写的注意事项:

  • 被private,final修饰的方法不能被重写。
  • 被staitc修饰的方法也不能被重写。
  • @override 可以检查你重写的方法名是否正确,最好要加上。
  • 方法重写一定满足方法名相同,参数列表相同,返回值相同。

对比方法重写与方法重载:

最后:重写不是进行在原来基础的修改,而是在原来基础上进行迭代和更新。

进一步认识和理解多态

场景:画一个图形

class Shape{//创建一个图形类---->作为多种图形的父类
    public int length;//图形的长
    public int wide;//图形的宽
    public int height;//图形的高
    public void draw() {
        System.out.println("我要画一个图形!!!");
    }
}
class rectangle extends Shape{//长方形
    @Override
    public void draw() {
        System.out.println("我要画一个长方形!!!");
    }
}
class square extends Shape{
    @Override
    public void draw() {
        System.out.println("我要画一个正方形!!!");
    }
}
class circular extends Shape{
    @Override
    public void draw() {
        System.out.println("我要画一个圆形!!!");
    }
}
public class TestDemo1 {
    public static void method(Shape shape) {
        shape.draw();
    }
    public static void main(String[] args) {
        Shape shape1 = new circular();
        Shape shape2 = new rectangle();
        Shape shape3 = new square();
        method(shape1);
        method(shape2);
        method(shape3);
    }
}

创建一个Shape(父类),然后创建三个子类分别是square ,circular,rectangle,利用父类引用这三个子类,接着调用method方法。

这就是多态,不同的对象,调用同一个方法最后结果产生出不同的状态。

我们再来总结多态产生的条件:

  • 要在继承体系下
  • 子类要对父类的方法进行重写
  • 通过父类的引用调用重写的方法

也就是 在继承体系下  进行向上转型  和 方法重写

多态的优点

优点:

  • 能够降低代码的 "圈复杂度", 避免使用大量的 if - else
  • 如果使用多态, 则不必写这么多的 if - else 分支语句, 代码更简单.
  • 可扩展能力更强

缺点:

  • 代码的运行效率降低

还有一个重要点就是不要在构造方法中调用重写方法

到此这篇关于Java全面分析面向对象之多态的文章就介绍到这了,更多相关Java多态内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 进一步理解Java中的多态概念

    多态性有两种: 1)编译时多态性 对于多个同名方法,如果在编译时能够确定执行同名方法中的哪一个,则称为编译时多态性. 2)运行时多态性 如果在编译时不能确定,只能在运行时才能确定执行多个同名方法中的哪一个,则称为运行时多态性. 方法覆盖表现出两种多态性,当对象获得本类实例时,为编译时多态性,否则为运行时多态性,例如: XXXX x1 = new XXXX(参数列表); //对象获得本类实例,对象与其引用的实例类型一致 XXX xx1 = new XXX(参数列表); x1.toString();

  • java 方法重写与权限修饰符以及多态和抽象类详解概念和用法

    1.方法重写 子类写和父类一样的方法定义 public void call(){ System.out.println("输出文字"); //父类的方法 } public void call(){ System.out.println("helloworld"); } //子类的方法 重写父类方法时,容易写错名字怎么办? 加个@Override 注解 如果报错,说明重写父类方法时,写错了 @Override: @Override public void call()

  • java中多态概念、实现原理详解

    一.什么是多态? 1.多态的定义 指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用) 2.多态的作用 消除类型之间的耦合关系 3.多态的说明 近代网络小说泛滥,我们可以用它来举一个例子 某日你看见你手机上有多部小说同时更新了,比如有大主宰,雪鹰领主,龙王传说-在这里我们可以描述成如下: 小说a=大主宰 小说b=雪鹰领主 小说c=龙王传说 - 这里所表现的就是多态,大主宰,雪鹰领主,龙王传说都是小说的子类,我们仅仅可以通过小说这个

  • java多态的向上转型的概念及实例分析

    1.说明 向上转型就是把一个子类引用给一个父类引用,也就是父类引用 引用了子类的对象,即父类 父类对象 = 子类实例. 此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法,而不是父类的方法.但是调用的属性还是父类的属性. 2.实例 class Animal { public String name; public void eat() { System.out.println(this.name + " 正在吃"); } } class Cat extends Animal {

  • Java全面分析面向对象之多态

    目录 多态的理解 向上转型 向上转型的三种形式 动态绑定和静态绑定 方法的重写 进一步认识和理解多态 多态的优点 多态的理解 什么是多态呢??从字面理解就是多种形态,也就是不同类实例化出来的对象调用同一种方法,也可以理解为不同类的对象经过同一种行为产生的状态是不同的,这就是多态. 要想理解多态,我们必须要了解向上转型和重写这两个重点然后在来深刻理解多态这一概念,等看完向上转型与重写再来看多态的概念,你就会豁然开朗,一下就通透了不少.因为多态的条件就是向上转型,重写以及继承. 向上转型 首先多态的

  • Java全面分析面向对象之继承

    目录 继承 什么是继承呢? 子类访问父类的成员变量 子类访问父类非同名成员变量 子类访问父类同名成员变量 子类访问父类的成员方法 子类访问父类的非同名方法 子类访问父类的同名方法 super关键字 super访问父类成员变量 super访问父类成员方法 创建构造方法 super与this的区别 顺序 详解访问修饰限定符 继承方式与组合 继承方式 组合 继承 什么是继承呢? 继承(Inheritance)是一种联结类与类的层次模型.指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口

  • Java全面分析面向对象之封装

    目录 什么是封装呢 封装的好处意义 getter方法和setter方法 toString方法 面向对象封装之包 自定义包 什么是封装呢 封装就是一种将数据和操作数据的方法进行有机结合,一种函数抽象类的接口实现了对细节的封装和隐藏,使得我们只需要调用对外开放的公共接口去实现与对象的交互.我们可以把封装理解为一种保护的屏障,需要一些严格的接口进行控制,我们可以修改自己实现类的内部结构的代码,但是不可以修改那些公共接口.这就提供更好的安全性. 封装的好处意义 好的封装能够减少耦合度 能够对成员变量更精

  • 新手小白入门必学JAVA面向对象之多态

    目录 1. 概念 2 . 特点 3. 练习:多态入门案例 4. 多态的好处 5. 多态的使用 6. 练习:多态成员使用测试 7 拓展 7.1 设计汽车综合案例 7.2 多态为了统一调用标准 7.3 静态变量和实例变量的区别 7.4 向上转型和向下转型 总结 1. 概念 多态是面向对象程序设计(OOP)的一个重要特征,指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态. 可以把不同的子类对象都当作父类来看,进而屏蔽不同子类对象之间的差异,写出通用的代码,

  • Java由浅入深分析多态的概念

    目录 1.多态的概念 2.向上转型 2.1概念 2.2常见的向上转型的形式 3.重写 3.1重写的注意事项 在结束继承内容之后便是多态,这同样也是面向对象程序的特性 有一点需要说明:为方便演示,所以我在一个java文件中定义了多个类,但实际上是不推荐这么做的 1.多态的概念 简单来讲就是不同的对象去完成同一个行为,但是产生了不同的状态 一个很简单的例子:学校某个班级的学生参加同一场考试,考试结束后不同的学生的考试成绩都是不同的,有的不及格.有的在及格线上游走.而有的则是高分,那么你在哪个水平~(

  • Java中构造器内部的多态方法的行为实例分析

    本文实例讲述了Java中构造器内部的多态方法的行为操作.分享给大家供大家参考,具体如下: 这篇文章主要讨论的是,若在一个构造器中调用正在构造的对象的某个动态绑定的方法时会出现的情况.在此之前,我们需要知道构造器是如何在复杂的层次结构中运作的,尽管构造方法并不具有多态性,因为它们实际上是static方法,只不过是隐式声明的static. 复杂层次结构中构造器的调用顺序 基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次逐渐向上链接,以使每个基类的构造器都能得到调用.这样做是因为,在Jav

  • Java基础之面向对象机制(多态、继承)底层实现

    一.Java的前世 为什么会产生Java?Java的特点是什么? 从C语言开始讲,C语言是一种结构化语言,模块化编程,便于程序的调试,依靠非常全面的运算符和多样的数据类型,可以轻易完成各种数据结构的构建,通过指针类型更可对内存直接寻址以及对硬件进行直接操作,因此既能够用于开发系统程序,也可用于开发应用软件.其缺点就是封装性弱,程序的安全性上不是很好.C语言的异常处理一般使用setjmp()与longjmp(),在捕获到异常时进行跳转:或者使用abort()和exit()两个函数,强行终止程序的运

  • Java面向对象之多态

    目录 一.前言 二.什么是多态? 三.多态的实现条件 四.多态的访问特点 1.我们建一个service包放Animal类 2.再servic包下建一个impl包,包下放Cat类 3.我们在建一个controller包,在里面建一个动物测试类 4.弄完之后我们程序一运行 4.1为什么两个有区别呢? 五.多态的优点和缺点? 六.为什么要分开建包 一.前言 前面我们了解和学习了继承的使用,现在我们来学习三大面向对象之一的多态. 多态使java面向对象丰富起来,所以学好多态十分重要. 二.什么是多态?

  • Java轻松掌握面向对象的三大特性封装与继承和多态

    目录 1.封装 1.介绍 2.封装的理解和好处 3.封装的实现步骤 2.继承 1.介绍 2.继承的基本语法 3.继承的使用细节 3.super关键字 1.基本介绍 2.基本语法 3.细节与好处 4.super与this的比较 4.方法重写 1.基本介绍 2.注意事项与使用细节 3.重载与重写的比较 3.多态 1.基本介绍 2.具体体现 1.方法的多态 2.对象的多态(重点) 3.多态注意事项和细节讨论 1.多态的前提 2.属性 3.instance of 4.多态的向上转型 5.多态的向下转型

  • 详解Java面向对象之多态的原理与实现

    目录 何为多态 代码实现 多态理解 何为多态 定义: 多态是指不同的子类在继承父类后分别都重写覆盖了父类的方法,即父类同一个方法,在继承的子类中表现出不同的形式.系统在运行时(而非编译时),能够根据其类型确定调用哪个重载的成员函数的能力,称为多态性. 特点: (1)多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,就是同一种事物表现出的多种形态. (2)多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话. (3)对不同类的对象

随机推荐