多态

多态存在的三个必要条件:继承重写父类引用指向子类对象
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则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. 什么?欧洲也有个恩智浦杯?
  2. mysql 性能查看_MySQL查询性能问题排查
  3. python语言基础与应用 mooc答案_Python语言基础与应用_中国大学mooc慕课_期末考试选修课答案...
  4. SQL查询【根据生日计算】
  5. oracle中varchar2的储存长度
  6. tarball_如何在墙上扔一个tarball
  7. D-Link 修复多个硬编码密码漏洞
  8. ATF DSP PC-Tool(电脑调音软件)v3.20官方版
  9. 通信协议 - ARINC615A加卸载协议
  10. 《人类最美的54个公式》
  11. AQS源码解读(六)——从PROPAGATE和setHeadAndPropagate()分析共享锁的传播性
  12. win7共享网络的方法简述
  13. 科大奥锐干涉法测微小量实验的数据,大学物理实验教材课后思考题答案 (4)
  14. 大专毕业C/C++零基础学编程难吗?多久能就业?
  15. 限制电脑使用指定的软件
  16. 实现radio单选框单击取消选中状态
  17. TypeScript Mixins 混入
  18. IMAS辅导书籍推荐
  19. 大牛证券解析恒指大跌800点+全球股市大跌
  20. 基于javaSpringboot+layui实现装修验收管理系统

热门文章

  1. PhotoShop -光影魔术手补光的原理
  2. 学计算机需要笔记本嘛,大学生入学后,新生有必要买电脑吗?听完学长的建议再做打算...
  3. 微信小程序循环调用函数出错
  4. 2017无盘服务器,(2017.11.19)云更新2017正式版2017.6.15.6596无盘xp-win7x32-x64-win10x64公包...
  5. 办公室绿植的风水讲究
  6. 禾川PLC有什么缺点
  7. 《惢客创业日记》2021.05.19(周三)如果你是司机,该怎么办?
  8. 公开一个收费2万元的线下项目玩法
  9. Linux最帅版主所经历的面试题
  10. 中文字母数字下划线_正则表达式校验