多态的缺点(“覆盖”私有方法、域与静态方法)
来源:互联网 发布:办公软件培训班多少钱 编辑:程序博客网 时间:2024/06/10 18:39
多态在Java中应用非常广泛,好处很多,但是有需要注意的地方。
一、覆盖私有方法
package com.study.base;public class Polymorphic { private void f(){ System.out.println("父类f()方法执行"); } public static void main(String[] args){ Polymorphic po = new Derived(); po.f(); }}class Derived extends Polymorphic{public void f(){System.out.println("子类的f()方法执行");}}运行上面的main方法,运行的结果如下,可以看到本来我们预期是应该输出的是"子类f()方法执行"。但是实际输出的却是"父类f()方法执行",之所以会出现这种现象,是因为在父类中f()方法是私有的,这样的话,子类虽然继承了父类,但是子类中的f()方法已经是新的方法了,与父类的f()方法没有什么关系。而我们的main方法是写在父类当中,因此输出的便是父类的f()方法。如果父类的f()方法是public的话,子类才会覆盖父类的f()方法,输出才会按照我们期望的进行输出。
二、域
package com.study.base;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(); System.out.println("sup.field="+sup.field+" sup.getField()="+sup.getField()); Sub s = new Sub(); System.out.println("s.field="+s.field+" s.getField()="+s.getField()); System.out.println("s.getSuperField="+s.getSuperField()); }}运行上面的代码,运行结果如下所示:
sup.field=0 sup.getField()=1s.field=1 s.getField()=1s.getSuperField=0之所以出现上面的结果是因为多态针对的是公有的非静态的getField()方法,而不是字段(域),所以sup虽然指向子类的实例,但是由于sup.field直接访问的是域,而域不具有多态性,因此输出的是基类的field的值0。getField()方法是公有的,并且是非静态的,因此它具备多态性,所以sup.getField()方法输出的是子类的field的值,也就是1。至于s.field和s.getField(),由于实例化时便都是子类,因此没有什么可说的,都是1。第三句输出是指从子类访问父类的field的值,当然得到的值便是0。
三、静态方法
package com.study.base;class StaticSuper{public static String staticGet(){return "Base staticGet()";}public String dynamicGet(){return "Base dynamicGet()";}}class StaticSub extends StaticSuper{public static String staticGet(){return "Sub staticGet()";}public String dynamicGet(){return "Sub dynamicGet()";}}public class StaticPolymorphic { public static void main(String[] args){ StaticSuper sup = new StaticSub(); System.out.println(sup.staticGet()); System.out.println(sup.dynamicGet()); }}运行上面的代码,结果如下:
Base staticGet()Sub dynamicGet()出现上面的结果是因为静态方法是没有多态性的,因此用父类指向子类的实例也无法访问子类的静态方法,只能访问子类的动态方法。
以上便是在使用多态时应该注意的地方。
阅读全文
0 0
- 多态的缺点(“覆盖”私有方法、域与静态方法)
- 关于继承中(静态方法+私有方法)的覆盖与重写问题
- 多态的缺陷 “覆盖”私有方法
- 多态的缺陷:“覆盖私有方法”
- 覆盖静态方法与非静态方法的区别
- java静态方法与非静态方法 覆盖的区别
- 覆盖静态方法与非静态方法的区别
- Java 继承与初始化、“覆盖”私有方法
- "覆盖"私有方法
- 缺陷:“覆盖”私有方法
- Java 覆盖私有方法
- 关于静态方法的覆盖
- java私有静态方法
- Java静态工程方法的优点和缺点
- 再探私有/公有静态成员变量与私有静态成员方法
- 再探私有/公有静态成员变量与私有静态成员方法
- 方法的覆盖与重载
- 方法的重载与覆盖
- 人脸检测发展:从VJ到深度学习(下)
- (四)附加属性
- 贪心算法----装箱问题
- linux syslog日志
- 简述面向对象的6大原则
- 多态的缺点(“覆盖”私有方法、域与静态方法)
- 解决Idea创建maven-archetype-webapp项目无java目录的问题
- 2、笔记搭建一个个人网站——Wordpress WordPress
- 【01】Bootstrap入门
- Find Duplicate File in System
- 3、笔记搭建一个个人网站——环境准备
- HTTP Components简介
- [idea中配置maven]
- 09.02 问题解决(初步)