文章目录

多态性

可以理解为一个事物的多种形态。

对象的多态性:父类的引用指向子类的对象。只适用于方法,不适用于属性(编译和运行都看左边)

总结:对于对象的多态性,编译,看左边;运行,看右边。

有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。

虚拟方法:子类中定义了与父类同名同参数的方法,在多态情况下,将此时父类的方法称为虚拟方法,父类根据赋给它的不同子类对象,动态调用属于子类的该方法。这样的方法调用在编译期是无法确定的。

多态性的使用前提:

  • 类的继承关系
  • 方法的重写

使用实例:

  1. class Animal{
  2. public void eat(){
  3. System.out.println("动物:进食");
  4. }
  5. public void shout(){
  6. System.out.println("动物:叫");
  7. }
  8. }
  9. class Dog extends Animal{
  10. public void eat(){
  11. System.out.println("狗吃骨头");
  12. }
  13. public void shout(){
  14. System.out.println("汪!汪!汪!");
  15. }
  16. public void watchDoor(){
  17. System.out.println("看门");
  18. }
  19. }
  20. class Cat extends Animal{
  21. public void eat(){
  22. System.out.println("猫吃鱼");
  23. }
  24. public void shout(){
  25. System.out.println("喵!喵!喵!");
  26. }
  27. }
  1. public class Test {
  2. public static void main(String[] args) {
  3. Test test = new Test();
  4. test.func(new Dog());
  5. test.func(new Cat());
  6. }
  7. public void func(Animal animal){//Animal animal = new Dog();
  8. animal.eat();
  9. animal.shout();
  10. }
  11. }

向下转型

  1. public class Person {
  2. String name;
  3. int age;
  4. int id = 1001;
  5. public void eat(){
  6. System.out.println("人:吃饭");
  7. }
  8. public void walk(){
  9. System.out.println("人:走路");
  10. }
  11. }
  12. public class Man extends Person{
  13. boolean isSmoking;
  14. int id = 1002;
  15. public void earnMoney(){
  16. System.out.println("男人负责挣钱养家");
  17. }
  18. public void eat(){
  19. System.out.println("男人多吃肉,长肌肉");
  20. }
  21. public void walk(){
  22. System.out.println("男人霸气的走路");
  23. }
  24. }

有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。

  1. p2.name = "Tom";
  2. p2.earnMoney();//无法调用
  3. p2.isSmoking = true;//无法调用

如何调用子类特有的属性与方法呢?

向下转型:使用强制类型转换符。

  1. Man m1 = (Man)p2;
  2. m1.earnMoney();//可以调用
  3. m1.isSmoking = true;//可以调用

使用强转时,可能出现ClassCastException的异常。

  1. Woman w1 = (Woman)p2;
  2. w1.goShopping();//man不能转成woman

此时应该用instanceof来判断是否可以向下转型。

判断对象a是否是类A的实例。如果是,返回true;如果不是,返回false。

使用情境:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先
进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。

  1. //编译时通过,运行时不通过
  2. Person p3 = new Woman();
  3. Man m3 = (Man)p3;
  4. //编译通过,运行时也通过
  5. Object obj = new Woman();
  6. Person p = (Person)obj;
  7. //编译不通过
  8. Man m5 = new Woman();
  9. String str = new Date();
  10. Object o = new Date();
  11. String str1 = (String)o;

【Java】多态性的更多相关文章

  1. Java多态性举例说明

    Java多态性的概念也可以被说成“一个接口,多个方法”. (一)相关类 class A ...{ public String show(D obj)...{ return ("A and D ...

  2. java多态性方法的重写Overriding和重载Overloading详解

    java多态性方法的重写Overriding和重载Overloading详解 方法的重写Overriding和重载Overloading是Java多态性的不同表现.重写Overriding是父类与子类 ...

  3. Java多态性的“飘渺之旅”

    原文出处:斯武丶风晴 摘要: 如何从Java多态性进行飘渺之旅呢? 我们用例子来旅行. 朵星人A:人类,是一个很奇妙的物种. 朵星人B:他们好像分为两种,嗯 先生,以及美女? 朵星人C:对,更年轻的有 ...

  4. [转载]深入理解java多态性

    FROM:http://blog.csdn.net/thinkGhoster/article/details/2307001 昨天看到一个关于多态性的帖子,参考了回帖者的理解,加入了一些自己的看法,整 ...

  5. Java多态性详解 (父类引用子类对象)

    面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据. 继承是为了重用父类代码,同时为实现多态性作准备.那么什么是多 ...

  6. Java多态性详解——父类引用子类对象

    来源:http://blog.csdn.net/hikvision_java_gyh/article/details/8957456 面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实 ...

  7. Java多态性——分派

    一.基本概念 Java是一门面向对象的程序设计语言,因为Java具备面向对象的三个基本特征:封装.继承和多态.这三个特征并不是各自独立的,从一定角度上看,封装和继承几乎都是为多态而准备的.多态性主要体 ...

  8. java多态性,父类引用指向子类对象

    父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal animal = new C ...

  9. java多态性

    多态分两种: (1)   编译时多态(设计时多态):方法重载. (2)   运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态.(我们平时说得多的事运行时 ...

  10. Java多态性理解

      Java中多态性的实现 什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对 ...

随机推荐

  1. [BUUCTF]REVERSE——SimpleRev

    SimpleRev 附件 步骤: 例行查壳儿,,无壳,64位程序 64位ida载入,看main函数 关键代码段在Decry函数里 unsigned __int64 Decry() { char v1; ...

  2. C#面对抽象编程第一讲

    闲话不多说,面向对象编程是高级语言的一个特点,但是把它概括成面向抽象更容易直击灵魂,经过了菜鸟大家都要面对的是不要写这么菜的代码了. 上例子,这应该是大家都很熟悉耳熟能详的代码, so easy. 1 ...

  3. Nginx中配置反向代理的proxy_pass的不同斜杠的区别

    location /api1/ { proxy_pass http://localhost:8080; } # http://localhost/api1/xxx -> http://local ...

  4. Tomcat高级特性及性能调优

    Tomcat对Https的支持 HTTPS简介 Https,是以安全为目标的Http通道,在Http的基础上通过传输加密和身份认证保证了传输的安全性.HTTPS在HTTP的基础上加入SSL层,HTTP ...

  5. iOS越狱插件源查找及避免插件劫持

    1.关于 iOS越狱插件源查找地址:https://www.ios-repo-updates.com/ 2.注意 不要使用不可靠的第三方源,其可能存在劫持,而你却茫然不知. 使用上面的网站查找你需要的 ...

  6. 【LeetCode】754. Reach a Number 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数学 日期 题目地址:https://leetcod ...

  7. 【LeetCode】382. Linked List Random Node 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数组保存再随机选择 蓄水池抽样 日期 题目地址:ht ...

  8. 前端项目 node8升级到node16,代码升级汇总

    背景 公司的项目是vue项目,环境是node@8x版本的,最近我创建react hook的项目,发现至少需要node14才支持,打开官网才发现node都已经到16版本了.失策啊,失策.于是直接升级到最 ...

  9. NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

    目录 概 主要内容 positional encoding 额外的细节 代码 Mildenhall B., Srinivasan P. P., Tancik M., Barron J. T., Ram ...

  10. Java面向对象程序设计作业目录(作业笔记)

    持续更新中............. 我的大学笔记>>> 第1章 面向对象 >>> 1.1.5 编写Java程序,创建Dota游戏中的防御塔类,通过两个坐属性显示防 ...