Java中的多态
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java中的多态,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4316字,纯文字阅读大概需要7分钟。
内容图文
![Java中的多态](/upload/InfoBanner/zyjiaocheng/630/606fb6b5219d47d7a30bde169240f34f.jpg)
多态与HoFs
朋友们好久不见啊,最近笔者同时在写脚本型语言——
JavaScript
,和工业级的面向对象语言——Java
。 在写代码的同时呢,也会思考这些语言的不同。今天就拿 Java 中的多态,来谈一谈吧!
概念
多态(Polymorphism)
多态性的核心是多种表现形式。在 Java
中,多态性是指对象可以拥有多种形式或者说类型。在面向对象的编程中,多态与如何将一个对象视为其自身类的实例,或者是它的父类的实例,又或者父类的父类的实例等相关。
上面那段话或许有些抽象,还是让我们举个例子吧:
假设我们拥有两个类:
SLList
类和 VengefulSLList
类,
其中 VengefulSLList
类继承自 SLList
类。并覆写(override)了, removeLast
方法(method)。
我们运行以下代码:
结果:
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
。
它规定了所有要实现该接口的类,要实现它的 compareTo(T obj)
方法。
通过接口,我们也可以巧妙的实现,对各种类型的对象,提供一个通用的解决方法!
比如我们要实现一个自己的 Util
类,里面有一个 max(Comparable[] items )
方法,它的功能是,返回给定的对象数组中最大的那个对象。
这里我们使用 Dog
类做演示:
项目目录:
我们实现了三个类,分别是 Dog
,Util
,Util
代码如下:
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
needscompareTo
). A callback function is the helping function (in the scenario,compareTo
).
refer:
内容总结
以上是互联网集市为您收集整理的Java中的多态全部内容,希望文章能够帮你解决Java中的多态所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。