ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java中的多态

2020-06-07 17:55:02  阅读:340  来源: 互联网

标签:Comparable Java 多态 我们 return Dog public


多态与HoFs

朋友们好久不见啊,最近笔者同时在写脚本型语言——JavaScript,和工业级的面向对象语言——Java。 在写代码的同时呢,也会思考这些语言的不同。今天就拿 Java 中的多态,来谈一谈吧!

概念

多态(Polymorphism)

多态性的核心是多种表现形式。在 Java中,多态性是指对象可以拥有多种形式或者说类型。在面向对象的编程中,多态与如何将一个对象视为其自身类的实例,或者是它的父类的实例,又或者父类的父类的实例等相关。


上面那段话或许有些抽象,还是让我们举个例子吧:

假设我们拥有两个类:

SLList 类和 VengefulSLList 类,

其中 VengefulSLList 继承SLList 类。并覆写(override)了, removeLast 方法(method)

我们运行以下代码:

Extends

结果:

sl.addLast(50) ; //VengefullSLList没有覆写,调用的是父类(即SLList)的方法

sl.removeLast(); //调用的是自己覆写的 removeLast( ) 方法!

再看一个例子:

public static void main(String[] args){
    VengefullSLList<Integer> s1 = new VengefullSLList<>(9);
    SLList<Integer> s2 = new SLList<>(8);
    s1.removeLast(); // 调用覆写的方法
    s2.removeLast(); // 调用 SLList类的方法
}

事实说明,即使是调用同一个方法,根据对象的不同,其产生的结果是多种多样的!而且,每个对象也能展现不同的类型。

HoF

Higher Order Function: A function that treats another function as data.

高级函数: 是指一个函数把其他函数当成数据。

例如 JavaScript 中的 function 就是一个 对象,可以当做参数传递。

Python 中我们可以这样来运用它:

def tenX(x):
	return 10*x
 
def do_twice(f, x):
	return f(f(x))
 
print(do_twice(tenX, 2))
# 200

然而在 Java 中我们没见过这样的用法,这是因为在 jdk8 以前 Java是禁止将函数当参数传递的!

问题

那么问题来了,如果 Java不允许 HoF 的存在,我们怎么解决这类问题呢?

例如比较大小:

def print_larger(x, y, compare, stringify):
    if compare(x, y):
        return stringify(x)
    return stringify(y)
# HoF 模式
def print_larger(x, y):
   if x.largerThan(y):
       return x.str()
   return y.str()
# Subtype Polymorphism 模式
# 子类的多样性

我们主要说说第二种方式:

在代码中,我们为每个对象提供了 largerThan()的方法,通过调用它实现比大小。但是在 Java 中,如果我们想要实现比较各种类型的对象大小的方法呢?比如说,我们要比较企鹅的大小,我们就要实现 企鹅类的 largerThan()方法。我们要比较海豹的大小,就要实现 海豹类的largerThan()方法,。。。。。。

我们发现如果直接实现子类的方法,我们无法实现通用的比较方案,在 C++中我们可以使用重载操作符,在JS中我们可以传入 compare函数。那么我们在Java中如何实现呢?

Comparable接口

前面我们提到了多态,有时候我们调用同名的方法,也会得到不同的结果。我们可以利用这种特性,来构造一个 compareTo() 方法。

Java中,我们有一个接口(interface) , 叫做 Comparable

comparable

它规定了所有要实现该接口的类,要实现它的 compareTo(T obj) 方法。

通过接口,我们也可以巧妙的实现,对各种类型的对象,提供一个通用的解决方法!

比如我们要实现一个自己的 Util类,里面有一个 max(Comparable[] items )方法,它的功能是,返回给定的对象数组中最大的那个对象。

这里我们使用 Dog类做演示:

项目目录:

我们实现了三个类,分别是 DogUtilUtil

代码如下:

public class Dog implements Comparable<Dog> {
    private int size; // 尺寸
    private String name; // 名字

    public Dog(){}
    public Dog(int size, String name){
        this.name = name;
        this.size = size;
    }
    public void bark(){
        System.out.println("My name is "+this.name+"!");
    }
    
    @Override
    public int compareTo(Dog other) { // 覆写的compareTo()方法
        return this.size - other.size;
    }
}
public class Util {
    public static Comparable max(Comparable[] items){
        int maxIndex=0;
        // 遍历找出size最大的狗
        for (int i = 0; i < items.length; i++) {
            int cmp = items[i].compareTo(items[maxIndex]);
            if(cmp>0){
                maxIndex = i;
            }
        }
        return items[maxIndex];
    }
}
public class LaunchDog {
    public static void main(String[] args) {
        Dog alice = new Dog(8,"alice");
        Dog ben = new Dog(12,"ben");
        Dog karn = new Dog(6,"karn");
        Dog[] dogs = new Dog[]{alice,ben,karn};
        // 调用 max() 方法
        Dog d =(Dog) Util.max(dogs);
        d.bark();
    }
}

最后的输出结果为:

My name is ben!

总结

通过分析以上代码,我们发现只要是 实现了 Comparable 接口的类都可以轻松使用 Util类中的 max() 方法选出最大的项。而在 Java 中我们的 集合框架就实现了 Comparable接口,拿来即用,十分方便。

所以,在项目中我们可以利用 接口(interface) , 来实现 在脚本语言中用 HoF 实现的功能。这体现了 Java的多态。

总结,Java通过提供接口 赋予了我们使用回调的能力。

To summarize, interfaces in Java provide us with the ability to make callbacks. Sometimes, a function needs the help of another function that might not have been written yet (e.g. max needs compareTo). A callback function is the helping function (in the scenario, compareTo).


refer:

USB的CS61b

joshhug老师的gitbook

Oracle的文档

标签:Comparable,Java,多态,我们,return,Dog,public
来源: https://www.cnblogs.com/jiaweixie/p/13061421.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有