多态

多态存在的三个必要条件:继承重写父类引用指向子类对象
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则error;如果有,调用子类的同名方法。
example:

package demo;public class people {public people(){}public void run(){System.out.println("10");}
}
package demo;public class player extends people{player(){}@Overridepublic void run() {//super.run();System.out.println("100");}public static void main(String[] args) {people bob = new player();bob.run();}
}

输出结果为100

多态的缺陷

  • “重写私有方法”
//: polymorphism/PrivateOverride.java
// Trying to override a private method.
package polymorphism;
import static net.mindview.util.Print.*;public class PrivateOverride {private void f() { print("private f()"); }public static void main(String[] args) {PrivateOverride po = new Derived();po.f();}
}class Derived extends PrivateOverride {public void f() { print("public f()"); }
} /* Output:
private f()
*///:~

期望输出的是public f(),但是父类中的private方法被自动认为是final方法,对子类是屏蔽的,所以不能被重载;所以在这种情况下,子类的f()被当作一个全新的方法。

  • 域(类变量成员变量或参数)
//: polymorphism/FieldAccess.java
// Direct field access is determined at compile time.class Super {public int field = 0;public int getField() { return field; }
}class Sub extends Super {public int field = 1;public int getField() { return field; }public int getSuperField() { return super.field; }
}public class FieldAccess {public static void main(String[] args) {Super sup = new Sub(); // UpcastSystem.out.println("sup.field = " + sup.field +", sup.getField() = " + sup.getField());Sub sub = new Sub();System.out.println("sub.field = " +sub.field + ", sub.getField() = " +sub.getField() +", sub.getSuperField() = " +sub.getSuperField());}
} /* Output:
sup.field = 0, sup.getField() = 1
sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0
*///:~

所有的域操作都不是多态的,对于子类,域有不同的存储空间。

  • 静态方法
    静态方法属于类,不能被重写

子类重写父类方法调用父类方法

在c++中,可以通过向上提升的类型操作实现对父类行为的调用,而在Java中,无论对其进行什么样的类型转换,其类型实际上是不变的,只能通过super调用。
example:

package demo;public class people {public people(){}public void run(){System.out.println("10");}
}
package demo;public class player extends people{player(){}@Overridepublic void run() {super.run();System.out.println("100");}public static void main(String[] args) {people bob = new player();bob.run();}
}

多态示例1:

函数参数实现多态性

public class people {public people(){}public void run(){System.out.println("10");}
}
public class player extends people{player(){}@Overridepublic void run() {//super.run();System.out.println("100");}}
public class running {public void competition(people p1,people p2){//父类引用指向子类对象p1.run();p2.run();}public static void main(String[] args) {people bob = new player();people sam = new player();running round1 = new running();round1.competition(bob,sam);}
}

多态示例2:

接口实现多态性,解耦

public interface runrunrun {public void run();
}public class people implements runrunrun {public people(){}public void run(){System.out.println("10");}
}public class player implements runrunrun{player(){}//@Overridepublic void run() {//super.run();System.out.println("100");}
}public class running {public void competition(runrunrun p1,runrunrun p2){p1.run();p2.run();}public static void main(String[] args) {player bob = new player();player sam = new player();running round1 = new running();round1.competition(bob,sam);}
}

java多态实现示例,以及子类重写父类方法调用父类方法相关推荐

  1. java 调用父类的变量_java创建子类对象设置并调用父类的变量操作

    通过子类调用父类的变量,有两种方法: 1.把父类的变量设置成public: package triangle.opengl.wlz.stu.childusefathervariable; import ...

  2. java 多态 重载的区别_重写、覆盖、重载、多态几个概念的区别分析

    override->重写(=覆盖).overload->重载.polymorphism -> 多态 override是重写(覆盖)了一个方法,以实现不同的功能.一般是用于子类在继承父 ...

  3. java 父类构造函数_Java基础系列 - 子类继承父类,调用父类的构造函数

    package com.test7; public class test7 { public static void main(String[] args) { Son son = new Son(1 ...

  4. java 父类_java 调用父类的父类

    展开全部 在father中在定义一个62616964757a686964616fe59b9ee7ad9431333335313738调用父类的方法,在子类逐级调用...class GrandPa { ...

  5. Java JVM 动态方法调用之方法句柄 MethodHandle

    专栏原创出处:github-源笔记文件 ,github-源码 ,欢迎 Star,转载请附上原文出处链接和本声明. Java 核心知识专栏系列笔记,系统性学习可访问个人复盘笔记-技术博客 Java 核心 ...

  6. Java经典面试题:一个线程两次调用start()方法会出现什么情况?

    大家好,我是 Oracle首席工程师杨晓峰. 今天想和大家深入聊聊线程,相信大家对于线程这个概念都不陌生,它是Java并发的基础元素,理解.操纵.诊断线程是Java工程师的必修课,但是你真的掌握线程了 ...

  7. c++该转java吗_java多线程,静态方法加锁后,调用该方法会影响其它方法吗?

    从一个问题说起 一直想要把一些学习历程和感悟记录下来,却没有静下心来好好思考一下,今天,就从同学问到的一个问题开始,对同一个类的静态方法加锁后,调用该方法,其他方法的调用会受到影响吗? 对象锁与类锁 ...

  8. super方法 调用父类的方法

    描述 super() 函数是用于调用父类(超类)的一个方法. super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO).重复 ...

  9. java学习(50):子类继承会优先调用父类的构造器

    定义一个父类 public class Parent { public void run(){ System.out.println("我会跑步"); } public Paren ...

最新文章

  1. python列表(list)中出现次数最多的元素使用collection包的Counter方法
  2. 频域采样与恢复matlab实验,连续信号的采样与重构实验报告
  3. Android之SharedPreferences两个工具类
  4. kali-linux下搭建DVWA环境
  5. Java集合系列:Set解析
  6. 公有云 私有云 混合云_混合云不断变化的面貌
  7. 采访拍摄镜头技巧_采访开放文化公司的6个技巧
  8. 10分钟搭建MySQL Binlog分析+可视化方案
  9. Linux(一):VMware安装出现的问题
  10. 声网:疫情期间日均通话分钟数较日常增长近一倍 达15.6亿分钟
  11. vue图片滚动抽奖_Vue项目开发-仿蘑菇街电商APP
  12. 如何在 Mac 上将PDF 转换为 Word?
  13. 华为畅享max支持鸿蒙,华为手机怎么升级鸿蒙?华为鸿蒙系统支持手机型号大全...
  14. Horizon client连接windows桌面显示:USB设备已禁用/USB重定向功能已禁用
  15. moxa串口卡Linux驱动,moxa多串口驱动下载
  16. Python网络数据采集1(译者:哈雷)
  17. namecheap域名如何绑定IP
  18. C#篇-值类型和引用类型
  19. D3入门教程——坐标轴
  20. 华为策略路由加等价路由_华为策略路由配置实例

热门文章

  1. 【傲腾观察室】英特尔® 傲腾™ 技术如何提升云服务竞争力?
  2. android beam开关,三星S10e的5个超实用小技巧
  3. Windows 2008-NAP技术初探
  4. StringBuilder比String快?空嘴白牙证据呢
  5. 马斯克透露:SpaceX本周三将发射60颗太空互联网卫星
  6. 商业银行的绿色信贷、小微企业贷款余额等指标数据(2011-2020年)
  7. 早上被裁下午走人,女朋友也失业在家4个月,投字节简历堆成山
  8. python traceback报错_python3 使用traceback定位异常实例
  9. excel文件格式校验
  10. 无字母数字rce(ctfshow web入门56)