JavaSE 巩固 多态的细节研究
来源:互联网 发布:工作中可优化的流程 编辑:程序博客网 时间:2024/06/09 19:26
多态是 Java 成为高级语言的特性之一,它可以实现运行时动态绑定,正是因为如此,在使用多态的时候有许多细节的地方需要注意。
1. 多态和字段无关
代码
public class FieldAccess { public static void main(String[] args) { Super sup = new Sub(); System.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()); }}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; }}
运行结果
sup.field = 0, sup.getField() = 1
sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0
2. 多态和静态方法无关
代码
public class StaticPolymorphism { public static void main(String[] args) { StaticSuper sup = new StaticSub(); System.out.println(sup.staticGet());// 调用父类的静态方法,这时候只和类有关 System.out.println(sup.dynamicGet());// 调用子类的方法 }}class StaticSuper { public static String staticGet() { return "Base staticGet()"; } public String dynamicGet() { return "Base dynamicGet()"; }}class StaticSub extends StaticSuper { public static String staticGet() { return "Derived staticGet()"; } public String dynamicGet() { return "Derived dynamicGet()"; }}
运行结果
Base staticGet()
Derived dynamicGet()
3. 多态时的私有方法
代码
public class PrivateOverride { private void f () { System.out.println("private f()"); } public static void main(String[] args) { PrivateOverride derived = new Derived(); derived.f();// private f() }}class Derived extends PrivateOverride { public void f() { System.out.println("public f()"); }}
运行结果
private f()
4. 警惕不正当的初始化
问题代码
class Father { public void show() { System.out.println("Father.show()"); } public Father() { System.out.println("Father before show()"); show();//这里将会调用子类的方法, 此时son中的money没有初始化, 有安全风险 System.out.println("Father after show()"); }}class Son extends Father { private int money = 100; public Son(int money) { this.money = money; System.out.println("Son constructor, money = " + money); } @Override public void show() { System.out.println("Son.show(), money = " + money); }}public class PolyConstructors { public static void main(String[] args) { new Son(88); }}
运行结果
Father before show()
Son.show(), money = 0
Father after show()
Son constructor, money = 88
在多态的情况下,这种问题一定要格外小心,最好的方法是在构造的时候不要使用多态。
阅读全文
0 0
- JavaSE 巩固 多态的细节研究
- JavaSE 巩固 类的加载和对象创建的过程
- EvnetBus 细节的研究
- css细节巩固
- css中需要注意和巩固的细节
- 关于JavaSE ProcessBuilder的使用细节
- javase输入输出流易被忽视的细节
- [javase学习笔记]-7.7 this关键字的细节与应用
- [javase学习笔记]-8.3 static关键字使用的注意细节
- [javase学习笔记]-8.4 main函数的解析与细节
- javaSe-File类学习的一些细节问题
- JavaSE学习之二,细节!
- 函数的巩固
- [javase]javase的7788
- java 细节研究
- bug 调试 研究细节
- Cookie与会话--Session与SSO的实现细节研究
- panabit虚拟机安装以及实现的细节研究
- Android开机执行shell脚本
- Java BigDecimal 解决两个double相加控制小数位数的东东
- Linux mysql5.7源码安装
- 1040. 有几个PAT(25)
- Android常用控件之ImageView
- JavaSE 巩固 多态的细节研究
- 操作系统复习-2.2 处理机调度
- 可变参数应用在调试信息输出
- Linux.命令.env
- Larval 主从读写分离配置
- 011-Java-002
- 自定义FlowLayout
- Thymeleaf菜鸟教程
- java语言基础|如何在main方法前执行其他代码