Java多态到底都有啥好处

 更新时间:2021年05月21日 09:47:04   作者:wasane  
Java中的多态性有两种类型:编译时多态(静态绑定)和运行时多态(动态绑定)。方法重载是静态多态的一个例子,而方法重写是动态多态的一个例子,接下来通过本文给大家分享Java多态到底教了我干啥?有啥好处,一起了解下吧

多态到底是啥,就是当子类继承父类的方法时,对其继承下来的方法按照自己的方式重新定义(覆盖重写)。

1.向上转型。

之前继承有提到过。父类引用指向子类对象。这时的引用只能调用子类覆盖重写了的方法,不能调用子类特有方法。自动转换

public class Main {
	public static void main(String[]args) {
		Father f = new Son();
		f.money();
		
		
	}
}	
class Father{
	void money() {
		System.out.println("父类的钱");
	}
}
class Son extends Father{
	void money() {
		System.out.println("子类的钱");
	}
	void SonPlay() {
		System.out.println("爸爸我能打游戏吗?");
	}
}

运行结果:

假如我要该引用区调用子类特有的方法(不是覆盖重写)呢? 会报错 (下面的向下转型就是解决这个问题)

下面举个例子

不同语言输出"HelloWorld"

(1)父类为正常类

public class Language{ //编程语言类
	void HelloWorld() { //输出HelloWorld
		
	}
}
public class CLanguage extends Language{ //C语言类继承编程语言类
	void HelloWorld() { //输出HelloWorld
		System.out.println("printf(\"HelloWorld!\");");
	}
}
public class JavaLanguage extends Language{ //Java继承编程语言类
	void HelloWorld(){
		System.out.println("System.out.println(\"HelloWorld!\")");
	}
}

提供一个函数调用

public class Test {
	public static void main(String[]args) {
		
		//inputHelloWorld(new CLanguage());
		//inputHelloWorld(new JavaLanguage());
		//或者
		Language language;
		
		language = new CLanguage();
		inputHelloWorld(language);
		language = new JavaLanguage();
		inputHelloWorld(language);
		
		
	}
	public static void inputHelloWorld(Language language) {
		language.HelloWorld();
	}
}

在不改变函数的形参(父类)下,实参(子类)的改变不会让程序报错。也就是说,我只需要关心的是函数的形参是与Language类相关的类(本身或者子类对象)就行,而无需考虑传入的实参到底是哪个子类对象。

运行结果:

假如父类是接口或者是抽象类呢?也可以

(2)父类为接口

假如父类真的就是为了提供某标准,或者父类无需实现内容等情况,可以考虑吧父类变成接口,接口也支持多态。

public class Test {
	public static void main(String[]args) {
 
		//inputHelloWorld(new CLanguage());
		//inputHelloWorld(new JavaLanguage());
		//或者
		Language language;
		
		language = new CLanguage();
		inputHelloWorld(language);
		language = new JavaLanguage();
		inputHelloWorld(language);
		
		
	}
	public static void inputHelloWorld(Language language) {
		language.HelloWorld();
	}
}
 
interface  Language{ //编程语言类
	public void HelloWorld() ; //输出HelloWorld
		
	
}
class CLanguage implements Language{ //C语言类继承编程语言类
	public  void HelloWorld() { //输出HelloWorld
		System.out.println("printf(\"HelloWorld!\");");
	}
}
class JavaLanguage implements Language{
	public  void HelloWorld(){
		System.out.println("System.out.println(\"HelloWorld!\")");
	}
}

运行结果:

当然,抽象类作为父类也可以实现多态哦。

2.向下转型。

把父类引用指向子类对象的引用在强转为不同子类对象。 转完之后的对象可以调用子类特有方法

(解决上述的调用子类的特有方法会报错)

public class Main {
	public static void main(String[]args) {
		Father f = new Son();
		//f.money();
		Son s = (Son)f;
		s.SonPlay();
		
	}
}	
class Father{
	void money() {
		System.out.println("父类的钱");
	}
}
class Son extends Father{
	void money() {
		System.out.println("子类的钱");
	}
	void SonPlay() {
		System.out.println("爸爸我能打游戏吗?");
	}
}

运行结果:

在举上面的编程语言输出HelloWorld例子,假如我要求inputLanguage方法对于传入的实参中的子类对象进行判断,假如传入的对象是C语言类就输出新增的特有的方法,Java类也是一样

这里就有点像简单工厂模式(实参是啥我new啥)了,这里是实参是啥,我强转之后,我调用对应的方法。

public class CLanguage implements Language{ //C语言类继承编程语言类
	public  void HelloWorld() { //输出HelloWorld
		System.out.println("printf(\"HelloWorld!\");");
	}
	public void CReadMe() { //新增C语言子类特有方法
		System.out.println("我是C语言");
		
	}
}
public class JavaLanguage implements Language{
	public  void HelloWorld(){
		System.out.println("System.out.println(\"HelloWorld!\")");
	}
	public void JavaReadMe() {//新增Java子类特有方法
		System.out.println("我是Java");
	}
}

修改inputHelloWorld函数

public class Test {
	public static void main(String[]args) {
 
		//inputHelloWorld(new CLanguage());
		//inputHelloWorld(new JavaLanguage());
		//或者
		Language language;
		
		language = new CLanguage();
		inputHelloWorld(language);
		language = new JavaLanguage();
		inputHelloWorld(language);
		
	}
	public static void inputHelloWorld(Language language) {
		
		if(language instanceof CLanguage) { 
			CLanguage clanguage = (CLanguage) language;
			clanguage.CReadMe();
		}else if(language instanceof JavaLanguage) {
			JavaLanguage javalanguage = (JavaLanguage)language;
			javalanguage.JavaReadMe();
		}
        language.HelloWorld();
	}
}

运行结果:

总得来说,多态可以使函数在其父类形参不变下,实参可以传入多个不同的子类对象。

相关文章

  • java微信小程序步数encryptedData和开放数据解密的实现

    java微信小程序步数encryptedData和开放数据解密的实现

    这篇文章主要介绍了java微信小程序步数encryptedData和开放数据解密的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java流程控制语句最全汇总(中篇)

    Java流程控制语句最全汇总(中篇)

    这篇文章主要介绍了Java流程控制语句最全汇总(中篇),本文章内容详细,通过案例可以更好的理解数组的相关知识,本模块分为了三部分,本次为中篇,需要的朋友可以参考下
    2023-01-01
  • 关于ReentrantLock原理全面解读

    关于ReentrantLock原理全面解读

    这篇文章主要介绍了关于ReentrantLock原理全面解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 使用java实现各种数据统计图(柱形图,饼图,折线图)

    使用java实现各种数据统计图(柱形图,饼图,折线图)

    用Jfree实现条形柱状图表,java代码实现。可经常用于报表的制作,代码自动生成后可以自由查看。可以自由配置图表的各个属性,用来达到自己的要求和目的。本文给大家介绍使用java实现各种数据统计图(柱形图,饼图,折线图),需要的朋友可以参考下
    2015-10-10
  • java正则实现各种日期格式化

    java正则实现各种日期格式化

    本文给大家分享的是使用java结合正则表达式来实现各种日期的格式化功能,代码非常的简单,有需要的小伙伴可以参考下。
    2015-05-05
  • java自定义ClassLoader加载指定的class文件操作

    java自定义ClassLoader加载指定的class文件操作

    这篇文章主要介绍了java自定义ClassLoader加载指定的class文件操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Java实现自定义LinkedList类的示例代码

    Java实现自定义LinkedList类的示例代码

    LinkedList类跟ArrayList类不同,它通过指针以及结点的操作对链表进行增删改查。本文就来和大家分享下Java如何为实现自定义LinkedList类,需要的可以参考一下
    2022-08-08
  • java使用Jco连接SAP过程

    java使用Jco连接SAP过程

    这篇文章主要介绍了java使用Jco连接SAP过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • SpringBoot为啥不用配置启动类的实现

    SpringBoot为啥不用配置启动类的实现

    这篇文章主要介绍了SpringBoot为啥不用配置启动类的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Java数据结构之AC自动机算法的实现

    Java数据结构之AC自动机算法的实现

    AC自动机算法常被认为是Trie树+KMP算法的结合体,它是一个多模式匹配算法,在模式匹配领域被广泛应用。本文将详细为大家介绍AC自动机的原理与实现方法,感兴趣的可以了解一下
    2022-12-12

最新评论