这道题是来自牛客网的一位小哥在2019的最后一天面试系统开发工程师的补招的一个面试题目, 在Java面试中,多态是一个被问到的频率很高的一个概念。

面试官:什么是多态呢?
猪队友:多种形态,气体,液体,固体~
面试官:go out! now!

多态

多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数实现的。

java多态

多态是同一个行为具有多个不同表现形式或形态的能力。

多态就是同一个接口,使用不同的实例而执行不同操作,如图所示:

多态性是对象多种表现形式的体现。

现实中,比如我们按下 F1 键这个动作:

  • 如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;
  • 如果当前在 Word 下弹出的就是 Word 帮助;
  • 在 Windows 下弹出的就是 Windows 帮助和支持。

同一个事件发生在不同的对象上会产生不同的结果。

多态的优点

  1. 消除类型之间的耦合关系
  2. 可替换性
  3. 可扩充性
  4. 接口性
  5. 灵活性
  6. 简化性

多态存在的三个必要条件

  • 继承
  • 重写
  • 父类引用指向子类对象

比如:

Animal a = new Cat();

重写父类方法:

//父类
public class Father{//父类有一个打孩子方法public void hitChild(){}
}
//子类1
public class Son1 extends Father{//重写父类打孩子方法public void hitChild(){System.out.println("为什么打我?我做错什么了!");}
}
//子类2
public class Son2 extends Father{//重写父类打孩子方法public void hitChild(){System.out.println("我知道错了,别打了!");}
}
//子类3
public class Son3 extends Father{//重写父类打孩子方法public void hitChild(){System.out.println("我跑,你打不着!");}
}//测试类
public class Test{public static void main(String args[]){Father father;father = new Son1();father.hitChild();father = new Son2();father.hitChild();father = new Son3();father.hitChild();}
}

Java里没有多继承,一个类之能有一个父类。而继承的表现就是多态。一个父类可以有多个子类,而在子类里可以重写父类的方法(例如方法print()),这样每个子类里重写的代码不一样,自然表现形式就不一样。这样用父类的变量去引用不同的子类,在调用这个相同的方法print()的时候得到的结果和表现形式就不一样了,这就是多态,相同的消息(也就是调用相同的方法)会有不同的结果。

都调用了相同的方法,出现了不同的结果!这就是多态的表现!

如何理解向上转型?

我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类。我可以通过

Cat c = new Cat();

实例化一个Cat对象,这个不难理解。但当我这样定义时:

Animal a = new Cat();

这样代表什么意思呢?

很简单,它表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特:

定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。

所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;

对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。

来我们举个栗子:

class Father {public void func1(){func2();} public void func2(){System.out.println("AAA");}
}class Child extends Father{public void func1(int i){System.out.println("BBB");} public void func2(){System.out.println("CCC");}}public class Test {public static void main(String[] args) {Father child = new Child();child.func1();//打印结果将会是什么?}
}

上面的程序是个很典型的多态的例子。子类Child继承了父类Father,并重载了父类的func1()方法,重写了父类的func2()方法。重载后的func1(int i)和func1()不再是同一个方法,由于父类中没有func1(int i),那么,父类类型的引用child就不能调用func1(int i)方法。而子类重写了func2()方法,那么父类类型的引用child在调用该方法时将会调用子类中重写的func2()。

经过上面的分析我们可以知道打印的结果是什么呢? 很显然,应该是"CCC"

多态有什么好处?

  1. 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。//继承
  2. 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。 //多态的真正作用

几百本常用电子书免费领取:https://github.com/XiangLinPro/IT_book

If you cannot do great things, do small things in a great way.-- Napoleon Hill

如果你不能做伟大的事,那么就非凡地完成每件小事。
– 拿破仑.希尔

多态是什么 父类如何调用子类的方法(美团面试)相关推荐

  1. java父类调用子类方法_Java 中父类怎么调用子类的方法?

    父类能调用子类的方法吗? 答:能. 怎么做? ● 把子类传递到父类的有参构造中,然后调用. ● 使用反射的方式调用,你使用了反射还有谁不能调用的?! ● 父类调用子类的静态方法. 案例展示: pack ...

  2. 父类可以调用子类的方法吗_python类的继承、多继承及查找方法顺序

    讲解类的继承,先用无__init__()方法的类讲解,会更容易理解 分三部分讲解 1.单继承(无__init__()方法) 继承方式:子类(父类): 方法重写:防止执行父类的方法.不想继承父类的某个方 ...

  3. 父类的对象指向子类对象,父类可以调用子类的方法吗?

    例如父类Person指向子类Student: Person p = new Student(); 父类类型实例p可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的: ...

  4. 如何通过父类引用“调用”子类所独有的方法(向上转型意义)

    最近看书,看到向上引用的情况:派生类引用或指针转换为基类引用或指针被称为向上强制转换. BrassPlus dilly("Annie Dill",493222,2000); Bra ...

  5. c++父类调用子类的方法

    方法一:虚函数使用 在c++中,父类和子类虚函数都有对应的虚函数表,如果子类重写了虚函数,就会将新写的这个函数的地址放到他自己的表内,并且通过父类的指针指向子类所开辟的空间,这样就可以调用子类的方法 ...

  6. c++ 父类调用子类的方法

    c++ 父类调用子类的方法 1 虚函数使用 2 这个方法感觉不太实用 :强转转换 c++中子类转父类,父类转子类 此文参考 c++父类调用子类的方法

  7. Java多态-如何理解父类引用指向子类对象

    java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是"向上转型". 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过   C ...

  8. 【C++】多态问题:基类调用子类的protected或者private函数

    1.问题描述 如果在基类中虚函数是public,子类中重载时标记为protected或者private函数,是否还能访问这个函数? 答案是: 基类指针指向子类时,可以访问,并且访问的是子类重载后的函数 ...

  9. 如何通过父类引用“调用”子类所独有的方法

    该做法的意义何在,姑且不论.今天我们主要关注该功能的实现,至少在实现的思路上是对面向对象思想的一次深入理解. 首先一点,父类引用是无法调用子类独有的方法(不仅无法访问,而且是不可见的),结论是显然的, ...

最新文章

  1. bootstrap 时间日期日历控件(datetimepicker)附效果图
  2. myeclipse生成注册码,破解,不用下载任何文件,代码方式破解
  3. 生态伙伴 | 摹客入驻飞书,体验高效产品协作设计!
  4. python自动化办公都能做什么菜-Python自动化开发学习之三级菜单制作
  5. java修改字节码技术,Javassist修改class,ASM修改class
  6. mysql许多连接错误而被阻止_怎样解决mysql连接过多的错误?
  7. LeetCode之两数相加
  8. 使用日志审计查看MaxCompute执行过哪些操作
  9. 5.1 tensorflow2实现简单线性回归分析——python实战
  10. 利用border设置transparent绘制图形
  11. nodejs redis 发布订阅_Redis 发布订阅,小功能大用处,真没那么废材
  12. 跟进分析不一样的MTI商城
  13. R TALK | 旷视研究院范浩强周舒畅: AI计算机摄影的原理、应用与硬件设计
  14. 赫兹伯格的双因素激励理论(转载)
  15. excel 多行 取消隐藏_如何在Excel 2013中隐藏和取消隐藏行和列
  16. Akka and Actors
  17. 《黑客与画家》-1 为什么书呆子不受欢迎?
  18. 学霸是怎样炼成的(大一上篇)
  19. 如何快速掌握一门新技术
  20. 用Jsp开发wap应用

热门文章

  1. STC15单片机-ADC获取环境温度(NTC热敏电阻)
  2. Soloπ 工具使用见解
  3. 最精密的尺子,平面激光干涉仪的原理与应用
  4. 洛谷 P4168 [Violet]蒲公英 解题报告
  5. 市场营销学【最精典】案例分析
  6. 百度SDK移动开发平台学习 - 人体分析
  7. html标签360doc,360doc个人图书馆
  8. Sleep()简析 和Sleep(0)的妙用
  9. 价格为3000元的计算机的机型,2000-3000元左右的笔记本电脑推荐,性价比超高
  10. 基于R的FP树fp growth 关联数据挖掘技术在煤矿隐患管理