20220727-Java中多态总结

格言:我亦无他,唯手熟尔!

多态polymorphism:方法或者对象具有多种形态

代码示例

// 通过方法重载,展现同一种方法的不同形态
public class PolyMethod {
    public static void main(String[] args) {
        AA aa = new AA();
        aa.f();
        aa.f(1);
        aa.f(1, 2);
    }
}
class AA {
    public void f() {
        System.out.println("f()");
    }
    public void f(int i) {
        System.out.println("f(i)");
    }
    public void f(int i, int j) {
        System.out.println("f(i,j)");
    }
}

代码示例

// 通过子类继承父类并重写父类中的方法,体现同一个方法的不同形态
public class PolyMethod02 {
    public static void main(String[] args) {
        BB bb = new BB();
        bb.f();
        BBB bbb = new BBB();
        bbb.f();
    }
}
class BB {
    public void f() {
        System.out.println("BB f()");
    }
}
class BBB extends BB {
    @Override
    public void f() {
        System.out.println("BBB f()");
    }
}

代码示例

public class PolyObject {
    public static void main(String[] args) {
        People people = new Student();
        //people编译类型为People,运行类型为Student
        //System.out.println(people.id);
        //people.f2();
        System.out.println("name=" + people.name);
        System.out.println(people.show());
    }
}
class People {
    String name = "jack";
    int age = 18;
    public void f1() {
        System.out.println("People f1()");
    }
    public String show() {
        return "name=" + name + ",age=" + age;
    }
}
class Student extends People {
    int id = 1;
    double score = 100;
    @Override
    public String show() {
        return super.show() + ",id=" + id + ",score=" + score;
    }
    public void f2() {
        System.out.println("Student f2()");
    }
}

代码示例

public class PolyDetail02 {
    public static void main(String[] args) {
        A a = new B();
        System.out.println(a.count);
        //System.out.println(a.x);
    }
}
class A{
    int count = 10;
}
class B extends A{
    int count = 20;
    int x = 100;
}

代码示例

public class PolyDetail03 {
    public static void main(String[] args) {
        C c = new D();
        System.out.println(c instanceof C);
        System.out.println(c instanceof D);
        System.out.println(c instanceof Object);
        D d = new D();
        System.out.println(d instanceof C);
        System.out.println(d instanceof D);
        C cc = new C();
        System.out.println(cc instanceof C);
        System.out.println(cc instanceof D);
    }
}
class C {}
class D extends C {}

代码示例

public class DynamicBinding {
    public static void main(String[] args) {
        A a = new B();
        System.out.println(a.sum());
        System.out.println(a.sum1());
    }
}
class A {
    public int i = 10;
    public int sum() {
        return getI() + 10;
    }
    public int sum1() {
        return i + 10;
    }
    public int getI() {
        return i;
    }
}
class B extends A {
    public int i = 20;
    @Override
    public int sum() {
        return getI() + 20;
    }
    @Override
    public int sum1() {
        return i + 10;
    }
    @Override
    public int getI() {
        return i;
    }
}
  • 数组类型为父类类型,实际存放的数组元素为父类类型或者子类类型对象

代码示例

public class PolyArray {
    public static void main(String[] args) {
        // 创建Person类型的数组
        // 数组中存放Person类对象和其子类对象
        // 数组p的编译类型为Peron,运行类型动态绑定
        Person[] p = new Person[5];
        p[0] = new Person("A", 1);
        p[1] = new Student("B", 2, 100);
        p[2] = new Student("C", 3, 200);
        p[3] = new Teacher("D", 4, 20000);
        p[4] = new Teacher("E", 5, 30000);
        for (Person pp : p) {
            System.out.println(pp.say());
            //当调用子类的特有方法时,使用instanceof
            if (pp instanceof Student) {
                ((Student) pp).study();
            }
            if (pp instanceof Teacher) {
                ((Teacher) pp).teach();
            }
        }
    }
}
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=" + name + " age=" + age;
    }
}
class Student extends Person {
    private int score;
    public Student(String name, int age, int score) {
        super(name, age);
        this.score = score;
    }
    public int getScore() {
        return score;
    }
    public void setScore(int score) {
        this.score = score;
    }
    @Override
    public String say() {
        return super.say() + " score=" + score;
    }
    public void study() {
        System.out.println("学生 " + getName() + " 正在上课");
    }
}
class Teacher extends Person {
    private int salary;
    public Teacher(String name, int age, int salary) {
        super(name, age);
        this.salary = salary;
    }
    public int getSalary() {
        return salary;
    }
    public void setSalary(int salary) {
        this.salary = salary;
    }
    @Override
    public String say() {
        return super.say() + " salary=" + salary;
    }
    public void teach() {
        System.out.println("老师 " + getName() + "正在授课");
    }
}
  • 方法定义的形参类型为父类类型,实参类型允许为子类类型

代码示例

public class PolyParameter {
    public static void main(String[] args) {
        PolyParameter p = new PolyParameter();
        Employee[] e = new Employee[3];
        e[0] = new Employee("A", 100);
        e[1] = new Worker("B", 1000);
        e[2] = new Manager("C", 10000, 5000);
        for (Employee ee : e) {
            p.showEmpAnnual(ee);
            p.testWork(ee);
        }
    }
    public void showEmpAnnual(Employee e) {
        System.out.println(e.getName() + "的工资为:" + e.getAnnual());
    }
    public void testWork(Employee e) {
        if (e instanceof Worker) {
            ((Worker) e).work();
        } else if (e instanceof Manager) {
            ((Manager) e).manage();
        } else if (e instanceof Employee) {
        } else {
            System.out.println("类型有误");
        }
    }
}
class Employee {
    private String name;
    private double salary;
    public Employee(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }
    public double getAnnual() {
        return getSalary();
    }
}
class Worker extends Employee {
    public Worker(String name, double salary) {
        super(name, salary);
    }
    public void work() {
        System.out.println("普通员工 " + getName() + " 正在工作");
    }
    @Override
    public double getAnnual() {
        return super.getAnnual();
    }
}
class Manager extends Employee {
    private double bonus;
    public Manager(String name, double salary, double bonus) {
        super(name, salary);
        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() + getBonus();
    }
}

Original: https://www.cnblogs.com/zhanghuaze/p/16526879.html
Author: 淡忘的江南
Title: 20220727-Java中多态总结

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/615471/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java设计模式之(十)——组合模式

    1、什么是组合模式? Compose objects into tree structures to represent part-whole hierarchies.Compos…

    Java 2023年5月29日
    072
  • Java是一门强类型语言

    数据类型 语言类型 强类型语言 要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用 弱类型语言 java的数据类型 1 基本类型(primitive type)2 引用类…

    Java 2023年6月9日
    080
  • 零点问题与微分不等式

    零点问题与微分不等式 零点问题关注于”有没有解”,”有几个解”。 单调性与存在性 罗尔原话 多项式方程的根 单调性与存在性 可以使用…

    Java 2023年6月7日
    065
  • mapstruct解放Java对象转换

    当前web后端开发,都是使用多层工程结构,需要在VO,BO,DTO,DO等各种数据结构中相互转换。这些转换代码都是些比较简单的字段映射,类型转换,重复性工作比较高,可以使用一些工具…

    Java 2023年6月8日
    081
  • Nginx + FastCgi + Spawn-fcgi + c 的架构

    参考: nginx+c/c++ fastcgi:http://www.yis.me/web/2011/11/01/66.htm cgi探索之路:http://github.tian…

    Java 2023年5月30日
    079
  • Windows下Nginx的启动、停止、重启等命令

    Windows下Nginx的启动、停止等命令 在Windows下使用Nginx,我们需要掌握一些基本的操作命令,比如:启动、停止Nginx服务,重新载入Nginx等,下面我就进行一…

    Java 2023年5月30日
    060
  • 最简单的单线程变多线程的例子

    最简单的单线程变多线程的例子 背景 不知道你项目里有么有这样一个函数,这个函数里调用了大概十几来个函数,这十几个函数依次的从头写到位,而且这几个函数都是相对独立的,谁先执行谁后执行…

    Java 2023年6月8日
    085
  • java根据模板生成word文档

    首先引入pom.xml <dependency> <groupid>org.apache.poi</groupid> <artifacti…

    Java 2023年6月13日
    096
  • 戏说领域驱动设计(廿二)——聚合

    聚合的自白 大家好,我是聚合,在你们的期盼之下我终于出来了。其实早就想和大家见一面,不过作者每天总想着水流量,到现在才让我出来。他把实体和值对象这两个我家庭内的成员先介绍让我感觉非…

    Java 2023年6月7日
    063
  • Docker学习

    Docker简介 Docker是一个开源的应用容器引擎,是一个轻量级容器技术。Docker支持将软件编译成一个镜像,然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接…

    Java 2023年6月5日
    0149
  • Java8 List去掉重复对象以及保证添加顺序

    JAVA中List对象去除重复值,大致分为两种情况,一种是List、List这类,直接根据List中的值进行去重,另一种是List这种,List中存的是javabean对象,需要根…

    Java 2023年5月29日
    0103
  • netty搭建rpc框架

    netty想必大家都不陌生,我就不废话介绍了…(主要是懒,网上资料很多的) 本文主要使用netty搭建rpc远程调用框架,实现了个注册中心微服务,整合了springbo…

    Java 2023年6月7日
    095
  • 如何使用Java代码修改数组大小呢?

    数组是Java开发中非常重要的一个数据存储容器, 那可以存储多种类型,基础类型,引用类型,但是它有一个缺点,就是一旦创建后,就不可以修改数组的大小, 那么我们如何动态的扩容数组的大…

    Java 2023年6月15日
    079
  • 文件输入/输出流

    文件输入/输出流程序 运行期间,大部分数据都被存储在 内存中,当程序结束或被关闭时,存储在内存中的数据将会 消失。如果要 永久保存数据,那么最好的办法就是把数据保存到 磁盘的文件中…

    Java 2023年6月9日
    076
  • Java 字符串格式化和工具类使用

    前言 我们在做项目时候经常需要对字符串进行处理,判断,操作,所以我就总结了一下 java字符串一些常用操作,和推荐比较好用我在自用的工具类,毕竟有轮子我们自己就不用重复去写了,提供…

    Java 2023年6月13日
    090
  • 浏览器地址栏从输入地址到页面展示都发生了什么

    1 URL输入 2 DNS解析 浏览器会首先从缓存中找是否存在域名,如果存在就直接取出对应的ip地址, 其中会请求 第二步,本地系统缓存 如果浏览器缓存没找到,就检查本地操作系统的…

    Java 2023年6月6日
    091
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球