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();
	}
}

运行结果:

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

(0)

相关推荐

  • Java中继承、多态、重载和重写介绍

    什么是多态?它的实现机制是什么呢?重载和重写的区别在那里?这就是这一次我们要回顾的四个十分重要的概念:继承.多态.重载和重写. 继承(inheritance) 简单的说,继承就是在一个现有类型的基础上,通过增加新的方法或者重定义已有方法(下面会讲到,这种方式叫重写)的方式,产生一个新的类型.继承是面向对象的三个基本特征--封装.继承.多态的其中之一,我们在使用JAVA时编写的每一个类都是在继承,因为在JAVA语言中,java.lang.Object类是所有类最根本的基类(或者叫父类.超类),如果

  • java中重载,继承,重写和多态的区别

    重载,继承,重写和多态的区别: 1)继承是子类获得父类的成员. 2)重写是继承后重新实现父类的方法. 3)重载是在一个类里一系列参数不同名字相同的方法. 4)多态则是为了避免在父类里大量重载引起代码臃肿且难于维护. 网上看到一个有趣的说法是:继承是子类使用父类的方法,而多态则是父类使用子类的方法. 下面的例子包含了这四种实现: class Triangle extends Shape { public int getSides() {   return 3;  } } class Rectang

  • java中多态概念、实现原理详解

    一.什么是多态? 1.多态的定义 指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用) 2.多态的作用 消除类型之间的耦合关系 3.多态的说明 近代网络小说泛滥,我们可以用它来举一个例子 某日你看见你手机上有多部小说同时更新了,比如有大主宰,雪鹰领主,龙王传说-在这里我们可以描述成如下: 小说a=大主宰 小说b=雪鹰领主 小说c=龙王传说 - 这里所表现的就是多态,大主宰,雪鹰领主,龙王传说都是小说的子类,我们仅仅可以通过小说这个

  • Java面向对象编程(封装/继承/多态)实例解析

    本文主要介绍了面向对象的三大特征实例解析,下面看看具体内容. 封装 封装一个Teacher和Student类 package com.hz.test; public class Teacher { private String name; private String majorDirection; private String teachCourse; private int teachAge; public Teacher() { super(); } public Teacher(Stri

  • Java多态和实现接口的类的对象赋值给接口引用的方法(推荐)

    接口的灵活性就在于"规定一个类必须做什么,而不管你如何做". 我们可以定义一个接口类型的引用变量来引用实现接口的类的实例,当这个引用调用方法时,它会根据实际引用的类的实例来判断具体调用哪个方法,这和上述的超类对象引用访问子类对象的机制相似. //定义接口InterA interface InterA { void fun(); } //实现接口InterA的类B class B implements InterA { public void fun() { System.out.pri

  • java 多态性详解及常见面试题

    java多态性 多态分两种: (1)   编译时多态(设计时多态):方法重载. (2)   运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态.(我们平时说得多的事运行时多态,所以多态主要也是指运行时多态) 运行时多态存在的三个必要条件: 一.要有继承(包括接口的实现): 二.要有重写: 三.父类引用指向子类对象. 多态的好处: 1.可替换性(substitutability).多态对已存在代码具有可替换性.例如,多态对圆Circle类工作,对其他任

  • 关于Java三大特性之多态的总结

    面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 1.定义: 多态:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式.(发送消息就是函数调用) 2.实现多态的技术称为:动态绑定(dynamicbinding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法. 3.作用:消除类型之间的耦合关系. 4.现实中,关于多态的例子不胜枚举.比方说按下F1

  • Java多态到底都有啥好处

    多态到底是啥,就是当子类继承父类的方法时,对其继承下来的方法按照自己的方式重新定义(覆盖重写). 1.向上转型. 之前继承有提到过.父类引用指向子类对象.这时的引用只能调用子类覆盖重写了的方法,不能调用子类特有方法.自动转换 public class Main { public static void main(String[]args) { Father f = new Son(); f.money(); } } class Father{ void money() { System.out.

  • Java开发到底为什么要用 IoC 和 AOP

    作为一名 Java 开发,对 Spring 框架是再熟悉不过的了.Spring 支持的控制反转(Inversion of Control,缩写为IoC)和面向切面编程(Aspect-oriented programming,缩写为AOP)早已成为我们的开发习惯,仿佛 Java 开发天生就该如此.人总是会忽略习以为常的事物,所有人都熟练使用 IoC 和 AOP,却鲜有人说得清楚到底为什么要用 IoC 和 AOP. 技术肯定是为了解决某个问题而诞生,要弄清楚为什么使用 IoC 和 AOP,就得先弄清

  • 一文详解Java抽象类到底有多抽象

    目录 抽象类 1.引出抽象类 2.认识抽象类 接口 1.抽象类和接口的区别 2.认识接口 3.具体实现 USB接口 接口表示能力 抽象类 1.引出抽象类 向上转型带来的最大的好处就是参数统一化,使用共同的父类引用,就可以接收所有的子类实例. 多态非常依赖方法覆写,但是子类可以选择性的覆写父类的方法,若需要强制要求子类覆写方法,就会用到抽象类其实显示生活中就有很多的抽象类,这些类都是概念化的,没法具体到某个实例,但是能描述这一类对象的共同属性和方法,比如人类,就没法具体到某一类人,世界上有很多类人

  • Java多态(动力节点Java学院整理)

    什么是多态 1. 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 2. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式.(发送消息就是函数调用) 3. 实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法. 4. 多态的作用:消除类型之间的耦合关系. 5. 现实中,关于多

  • Java多态的使用注意事项

    Java多态是如何实现的?Java的多态和C++一样,是通过延时绑定(late binding)或者说运行时绑定(runtime binding)来实现的.当调用某一个对象引用的方法时,因为编译器并不知道这个引用到底指向的是变量声明时说明的类型对象,还是该类型子类的对象.因此编译器无法为这次调用绑定到具体的某个方法.只有通过java中的运行时类型识别(RTTI, Runtime type identification)在运行时绑定到具体的方法.下面是一个具体的例子: 复制代码 代码如下: cla

  • 详解Java多态对象的类型转换与动态绑定

    Java多态对象的类型转换 这里所说的对象类型转换,是指存在继承关系的对象,不是任意类型的对象.当对不存在继承关系的对象进行强制类型转换时,java 运行时将抛出 java.lang.ClassCastException 异常. 在继承链中,我们将子类向父类转换称为"向上转型",将父类向子类转换称为"向下转型". 很多时候,我们会将变量定义为父类的类型,却引用子类的对象,这个过程就是向上转型.程序运行时通过动态绑定来实现对子类方法的调用,也就是多态性. 然而有些时候

  • 简单了解Java多态向上转型相关原理

    这篇文章主要介绍了简单了解Java多态向上转型相关原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 多态性是面向对象的第三大特征. 多态的优点 改善代码的组织结构和可读性. 能够创建可扩展的程序.(随时可以加入新功能) 消除类型之间的耦合关系. 说实话,作为小白的我,并不太能够理解上面三个优点.随着深入学习,理解应该会越来越深吧,共勉. 向上转型 概念 Java允许把子类对象赋值给父类的引用变量,不用做任何强制转换,系统自动完成.向上转型来自

  • java 多态与抽象类详解总结

    目录 前言 多态 初识多态 什么是多态? 多态的分类 多态的必要条件 实现多态 向上转型 向下转型 instanceof运算符 具体实现 抽象类与抽象方法 为什么要使用抽象? 抽象方法 抽象类 前言 今天是2021LOL全球总决赛,一直不被大家看好的EDG冲到了决赛对战韩国队的DK,可以说EDG面对如此强大的对手,想赢是比较难的,为了给中国队打气我立下flag,如果EDG获胜那我就奖励自己学习到第二天6点,结果我就来了,,,恭喜EDG! 为了接下来接口的学习,我们先来学习多态与抽类相关的一些知识

  • Java多态的全面系统解析

    目录 Java基础知识(多态) 多态 多态的定义和存在的必要条件 多态的定义: 多态存在的三个必要条件 多态的案例 多态的好处 多态的弊端 引用类型转换 1.引用类型转换是什么,为什么需要它? 2.向上转型(自动转换) 3.向下转型(强制转换) 4.向下转型的问题 5.转型的异常 6.instanceof关键字 总结 茫茫人海千千万万,感谢这一秒你看到这里.希望我的能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! Java基础知识(多态) 多态 因为在程序运行时才确定具体的类,这

  • 通过实例分析java多态

    这篇文章主要介绍了通过实例分析java多态,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 首先来看这样的一段代码,其中对于类的定义如下: class Parent{ public int myValue=100; public void printValue() { System.out.println("Parent.printValue(),myValue="+myValue); } } class Child extends P

随机推荐