返回顶部
首页 > 资讯 > 后端开发 > Python >深入解析Java多态进阶学习
  • 840
分享到

深入解析Java多态进阶学习

2024-04-02 19:04:59 840人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录1.动态绑定机制实例A实例B实例C2.多态数组3.多态数组的高阶用法4.多态参数5.多态参数的高阶用法1.动态绑定机制 java的动态绑定机制非常重要 实例A 我们来看一个实例:

1.动态绑定机制

java的动态绑定机制非常重要

实例A

我们来看一个实例:

阅读上面的代码,请说明下面的程序将输出什么结果:

程序将会输出40和30,这个实例很简单,直接看运行类型即可,该代码的运行类型为B,所以会调用B类的方法

实例B

我们将上面的代码变通一下,将子类中的如下代码块注销:

随后继承机制会访问父类的sum方法:

那么这里有一个问题,此处的getI(),会执行子类的还是父类的呢?

当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定

代码的运行类型依然是B,所以此处会执行子类的getI()方法,结果输出为30

实例C

现在我们再变通以下上面的代码

再将子类中如下的代码块注销:

继承机制会执行父类的sum1方法:

那么这里有一个问题,此处的i,会使用子类的还是父类的呢?

属性没有动态绑定机制,哪里声明,哪里使用(使用当前类的)

此处的i在父类进行声明,所以会选用父类的i属性,结果为20

2.多态数组

定义:

数组的定义类型为父类类型,但是保存的实际元素类型为子类类型

Person父类:


public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String say() {
        return name + '\t' + age;
    }
}

Student子类:


public class Student extends Person{
    private double score;

    public Student(String name, int age, double score) {
        super(name, age);
        this.score = score;
    }

    // 重写父类的say方法
    public String say() {
        return super.say() + '\t' + score;
    }
}

Teacher子类:


public class Teacher extends Person {
    private double sal;

    public Teacher(String name, int age, double sal) {
        super(name, age);
        this.sal = sal;
    }

    public double getSal() {
        return sal;
    }

    public void setSal(double sal) {
        this.sal = sal;
    }

    public String say() {
        return super.say() + '\t' + sal;
    }
}

测试多态数组的使用:

public class Test {
    public static void main(String[] args) {
        // 多态数组的使用
        Person[] persons = new Person[5];
        persons[0] = new Person("dahe",20);
        persons[1] = new Student("wangwei",11,100);
        persons[2] = new Student("zhangsan",12,60);
        persons[3] = new Teacher("wang",33,15000);
        persons[4] = new Teacher("li",55,25000);

        // 循环遍历多态数组,调用say方法
        for (int i = 0; i < persons.length; i++) {
            String out = persons[i].say(); // 动态绑定机制,编译类型永远都是Person
            // 运行类型是根据实际情况由JVM机决定
            System.out.println(out);
        }
    }
}

输出:

dahe    20
wangwei    11    100.0
zhangsan    12    60.0
wang    33    15000.0
li    55    25000.0

3.多态数组的高阶用法

现在,教师子类新增了教学方法:

public void teach() {
    System.out.println("老师:" + getName() + "正在讲课!");
}

学生子类新增了学习方法:

public void study() {
    System.out.println("学生:" + getName() + "正在学习!");
}

那么,有没有办法通过多态数组来访问他们子类对应的独有的方法呢?事实上,可以通过巧妙使用instanceof来解决:

变通一下,改变多态数组的循环操作:

// 循环遍历多态数组,调用say方法
for (int i = 0; i < persons.length; i++) {
    String out = persons[i].say(); // 动态绑定机制,编译类型永远都是Person
    // 运行类型是根据实际情况由JVM机决定
    System.out.println(out);
    if (persons[i] instanceof Student) {
        // 向下转型
        Student student = (Student) persons[i];
        student.study();
    } else if (persons[i] instanceof Teacher) {
        Teacher teacher = (Teacher) persons[i];
        teacher.teach();
    }
}

输出:

dahe    20
wangwei    11    100.0
学生:wangwei正在学习!
zhangsan    12    60.0
学生:zhangsan正在学习!
wang    33    15000.0
老师:wang正在讲课!
li    55    25000.0
老师:li正在讲课!

大功告成!多态数组即强大又完美!

4.多态参数

方法定义的形参类型为父类类型,实参类型允许为子类类型

接下来我们来演示以下多态参数的使用:

父类:


public class Employee {
    private String name;
    private double sal;

    public Employee(String name, double sal) {
        this.name = name;
        this.sal = sal;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getSal() {
        return sal;
    }

    public void setSal(double sal) {
        this.sal = sal;
    }

    // 得到年工资的方法
    public double getAnnual() {
        return 12 * sal;
    }
}

员工子类:


public class Worker extends Employee{
    public Worker(String name, double sal) {
        super(name, sal);
    }

    public void work() {
        System.out.println("普通员工:" + getName() + "正在工作!");
    }

    public double getAnnual() {
        return super.getAnnual();
    }
}

经理子类:


public class Manager extends Employee{
    private double bonus; // 奖金

    public Manager(String name, double sal, double bonus) {
        super(name, sal);
        this.bonus = bonus;
    }

    public double getBonus() {
        return bonus;
    }

    public void setBonus(double bonus) {
        this.bonus = bonus;
    }

    public void manage() {
        System.out.println("经理:" + getName() + "正在管理!");
    }

    @Override
    public double getAnnual() {
        return super.getAnnual() + bonus;
    }
}

我们来测试一下,求不同岗位的雇员的年薪:


public class Test {
    public static void main(String[] args) {
        Worker zhang = new Worker("张工",1000);
        Manager milan = new Manager("milan", 5000, 2000);
        Test test = new Test();
        test.showEmpAnnual(zhang);
        test.showEmpAnnual(milan);
    }


    // 获取员工的年薪,采用多态参数
    public void showEmpAnnual(Employee e) {
        System.out.println(e.getAnnual());
    }
}

输出:

12000.0
62000.0

5.多态参数的高阶用法

我们来对上面的多态参数代码做一个完善,如果传入的是员工,则调用自己的work方法,如果传入的是经理,则调用自己的manage方法

增加一个下面的方法:

public void testWork(Employee e) {
    if (e instanceof Worker) {
        ((Worker) e).work(); // 向下转型
    } else if (e instanceof Manager) {
        ((Manager) e).manage();
    }
}

测试:

test.testWork(zhang);
test.testWork(milan);

输出:

普通员工:张工正在工作!
经理:milan正在管理!

到此这篇关于深入解析Java多态进阶学习的文章就介绍到这了,更多相关Java多态内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 深入解析Java多态进阶学习

本文链接: https://lsjlt.com/news/164166.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 深入解析Java多态进阶学习
    目录1.动态绑定机制实例A实例B实例C2.多态数组3.多态数组的高阶用法4.多态参数5.多态参数的高阶用法1.动态绑定机制 java的动态绑定机制非常重要 实例A 我们来看一个实例:...
    99+
    2024-04-02
  • 深入了解Go语言:进阶学习的必备要点
    Go语言是一种由Google开发的开源编程语言,其简洁、高效和易用的特点吸引了越来越多的开发者。如果你已经掌握了Go语言的基础知识,并希望更深入地了解和应用这门语言,那么进阶学习就显得...
    99+
    2024-02-27
    go语言 深入学习 进阶要点 网络编程 标准库
  • java深入学习之static静态代码块
    静态代码块static可以修饰属性、方法、内部类、代码块。静态代码块在类加载时就调用, 而且只执行一次, 并且优先于各种代码块以及构造函数。有一个地方的静态代码被使用,那么所有的静态代码块都会被调用。相关视频教程推荐:java免费视频教程示...
    99+
    2015-02-26
    java入门 java static 静态代码块
  • 深入学习C#多线程
    目录一、基本概念1、进程2、线程二、多线程2.1System.Threading.Thread类2.2 线程的常用属性2.2.1线程的标识符2.2.2线程的优先级别2.2....
    99+
    2024-04-02
  • 深入学习Kotlin 枚举的简洁又高效进阶用法
    目录引言1. 枚举类2. 枚举属性3. 枚举函数4. 枚举构造函数5. 枚举扩展函数结语引言 翻译自:towardsdev.com/mastering-e… Kotli...
    99+
    2023-05-19
    Kotlin 枚举进阶 Kotlin 枚举
  • 深入学习java之泛型
    概念:泛型,即“参数化类型”。就是将原来具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。本质:为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不...
    99+
    2017-12-30
    java入门 java 泛型
  • Java由浅入深分析多态的概念
    目录1.多态的概念2.向上转型2.1概念2.2常见的向上转型的形式3.重写3.1重写的注意事项在结束继承内容之后便是多态,这同样也是面向对象程序的特性 有一点需要说明:为方便演示,所...
    99+
    2024-04-02
  • 进阶JAVA篇-深入了解 List 系列集合
    目录         1.0 List 类的说明          1.1 List 类的常用方法         1.2 List 集合的遍历方式         2.0 ArrayList 集合的底层原理        2.1 从 Ar...
    99+
    2023-10-24
    java 开发语言
  • 深入解析Python中的多进程
    目录前言1.创建进程2.多进程中的Queue3.多进程与多线程的性能比较4.进程池pool5.共享内存6.进程锁lock前言 现在我们的计算机都是多个核的,通俗来说就是多个处理或者计...
    99+
    2024-04-02
  • 深入浅析vue2.x的进阶用法
    Vue是当前最为流行的前端框架之一。它的设计理念优雅、简洁,易于掌握。本文将介绍Vue2.x的进阶用法,涵盖了Vue的模板语法、组件化开发、路由和状态管理等方面。一、模板语法条件渲染Vue中的条件渲染通过v-if、v-else、v-show...
    99+
    2023-05-14
  • 【Java系列】深入解析Java多线程
    序言 你只管努力,其他交给时间,时间会证明一切。 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记一级重要蓝色:用来标记二级重要 希望这篇文章能让你不仅有一定的收获,而且可以愉快的学习,如果有什么建议...
    99+
    2023-08-31
    java 开发语言 jvm
  • opencv深入浅出了解机器学习和深度学习
    目录机器学习kNN算法图解kNN算法用kNN算法实现手写数字识别SVM算法图解SVM算法使用SVM算法识别手写数据k均值聚类算法图解k均值聚类算法使用k均值聚类算法量化图像颜色深度学...
    99+
    2024-04-02
  • 编程算法进阶:PHP、Spring、Laravel哪个框架更适合深入学习?
    随着技术的不断发展和更新,编程算法的学习已经成为了程序员们必不可少的一部分。而在编程算法中,框架则是更加重要的一个部分。目前,PHP、Spring、Laravel都是非常流行的框架。那么,对于初学者来说,这三个框架哪个更适合深入学习呢? ...
    99+
    2023-08-24
    spring laravel 编程算法
  • 深入学习java之transient关键字
    对于transient这个关键字或许很陌生基本没怎么用过,但是transient关键字在java中却起到了不可或缺的地位!在学习java的过程中transient关键字少见的原因其实离不开它的作用:transient关键字的主要作用就是让某...
    99+
    2021-04-10
    java入门 java transient 关键字
  • 进阶JAVA篇-深入了解枚举与抽象枚举
    目录       介绍一下枚举:           1.1枚举的概念           1.2具体如何来使用呢?           1.3对枚举小结           1.4抽象枚举概念           1.5对抽象枚举小结 ...
    99+
    2023-10-23
    java 开发语言
  • Java 内存模型进阶:深入理解 happens-before 关系
    一、happens-before 关系的基础 happens-before 关系是 JMM 定义的一种偏序关系,它规定了线程之间内存操作的顺序,确保了线程安全和并发编程的正确性。happens-before 关系主要分为以下几类: 程...
    99+
    2024-02-04
    Java 内存模型 happens-before 关系 线程安全 并发编程
  • Java深入分析动态代理
    目录代理模式静态代理动态代理JDK动态代理CGLIB动态代理JDK代理与CGLIB代理的区别"代理"这个词相信大家并不陌生,简单来说就是代替厂家来售卖商品,代理替...
    99+
    2024-04-02
  • 深入解析C++中的虚函数与多态
    1.C++中的虚函数C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类...
    99+
    2022-11-15
    虚函数 多态
  • Java 深入学习static关键字和静态属性及方法
    目录static关键字静态属性静态方法静态方法的使用静态代码块static关键字 在定义一个类时,只是描述某事物的特征和行为,并没有产生具体的数据,只有通过new关键字创建该类的实例...
    99+
    2024-04-02
  • Java Lambda 表达式进阶:从入门到精通的学习之旅
    1. Lambda 表达式概述 Lambda 表达式是一种匿名函数,它允许您在不声明方法的情况下定义一个函数。Lambda 表达式的语法如下: (parameters) -> expression 其中,parameters 是函...
    99+
    2024-02-26
    Java Lambda 表达式 函数式编程 匿名函数 闭包
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作