java多态实现示例,以及子类重写父类方法调用父类方法
多态
多态存在的三个必要条件:继承,重写,父类引用指向子类对象,
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则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多态实现示例,以及子类重写父类方法调用父类方法相关推荐
- java 调用父类的变量_java创建子类对象设置并调用父类的变量操作
通过子类调用父类的变量,有两种方法: 1.把父类的变量设置成public: package triangle.opengl.wlz.stu.childusefathervariable; import ...
- java 多态 重载的区别_重写、覆盖、重载、多态几个概念的区别分析
override->重写(=覆盖).overload->重载.polymorphism -> 多态 override是重写(覆盖)了一个方法,以实现不同的功能.一般是用于子类在继承父 ...
- java 父类构造函数_Java基础系列 - 子类继承父类,调用父类的构造函数
package com.test7; public class test7 { public static void main(String[] args) { Son son = new Son(1 ...
- java 父类_java 调用父类的父类
展开全部 在father中在定义一个62616964757a686964616fe59b9ee7ad9431333335313738调用父类的方法,在子类逐级调用...class GrandPa { ...
- Java JVM 动态方法调用之方法句柄 MethodHandle
专栏原创出处:github-源笔记文件 ,github-源码 ,欢迎 Star,转载请附上原文出处链接和本声明. Java 核心知识专栏系列笔记,系统性学习可访问个人复盘笔记-技术博客 Java 核心 ...
- Java经典面试题:一个线程两次调用start()方法会出现什么情况?
大家好,我是 Oracle首席工程师杨晓峰. 今天想和大家深入聊聊线程,相信大家对于线程这个概念都不陌生,它是Java并发的基础元素,理解.操纵.诊断线程是Java工程师的必修课,但是你真的掌握线程了 ...
- c++该转java吗_java多线程,静态方法加锁后,调用该方法会影响其它方法吗?
从一个问题说起 一直想要把一些学习历程和感悟记录下来,却没有静下心来好好思考一下,今天,就从同学问到的一个问题开始,对同一个类的静态方法加锁后,调用该方法,其他方法的调用会受到影响吗? 对象锁与类锁 ...
- super方法 调用父类的方法
描述 super() 函数是用于调用父类(超类)的一个方法. super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO).重复 ...
- java学习(50):子类继承会优先调用父类的构造器
定义一个父类 public class Parent { public void run(){ System.out.println("我会跑步"); } public Paren ...
最新文章
- python列表(list)中出现次数最多的元素使用collection包的Counter方法
- 频域采样与恢复matlab实验,连续信号的采样与重构实验报告
- Android之SharedPreferences两个工具类
- kali-linux下搭建DVWA环境
- Java集合系列:Set解析
- 公有云 私有云 混合云_混合云不断变化的面貌
- 采访拍摄镜头技巧_采访开放文化公司的6个技巧
- 10分钟搭建MySQL Binlog分析+可视化方案
- Linux(一):VMware安装出现的问题
- 声网:疫情期间日均通话分钟数较日常增长近一倍 达15.6亿分钟
- vue图片滚动抽奖_Vue项目开发-仿蘑菇街电商APP
- 如何在 Mac 上将PDF 转换为 Word?
- 华为畅享max支持鸿蒙,华为手机怎么升级鸿蒙?华为鸿蒙系统支持手机型号大全...
- Horizon client连接windows桌面显示:USB设备已禁用/USB重定向功能已禁用
- moxa串口卡Linux驱动,moxa多串口驱动下载
- Python网络数据采集1(译者:哈雷)
- namecheap域名如何绑定IP
- C#篇-值类型和引用类型
- D3入门教程——坐标轴
- 华为策略路由加等价路由_华为策略路由配置实例
热门文章
- 【傲腾观察室】英特尔® 傲腾™ 技术如何提升云服务竞争力?
- android beam开关,三星S10e的5个超实用小技巧
- Windows 2008-NAP技术初探
- StringBuilder比String快?空嘴白牙证据呢
- 马斯克透露:SpaceX本周三将发射60颗太空互联网卫星
- 商业银行的绿色信贷、小微企业贷款余额等指标数据(2011-2020年)
- 早上被裁下午走人,女朋友也失业在家4个月,投字节简历堆成山
- python traceback报错_python3 使用traceback定位异常实例
- excel文件格式校验
- 无字母数字rce(ctfshow web入门56)