java 继承多态的一些理解和不理解
1.向上转型的一个误区
一直以为Child 继承Parent以后, Parent p = new Child(); p可以调用Child类中拓展Parent的方法,原来必须在强制转换成Child类才可以。代码如下:
class Parent{
public void f(){};
public void g(){};
}
class Child extends Parent{
public void f(){};
public void g(){};
public void h(){};
public void i(){};
}
public class ParentSub {
public static void main(String[] args){
Parent [] p = {new Child(),new Parent()};
p[0].f();
//p[1].h(); error
p[1].g();
//((Child)p[1]).h(); error
((Child)p[0]).h();
}
}
从 p[1].h(); 无法使用我感受到了糊涂,如果Child 拓展了Parent 的方法,那是不是意味着在多态中不能动态的用到拓展的功能呢?
那么从下面的这个向上转型(子类被转化为父类),可是又缺少了子类的拓展方法。
package com.ebay.polymorphic;
class Parent2{
public void f(){};
public void g(){};
}
class Child2 extends Parent2{
public void f(){};
public void g(){};
public void h(){};
public void i(){};
}
public class ParentSub2 {
public void polymorphic(Parent2 p)
{
p.f();
p.g();
//p.h(); 错误,可是如果我想用到Child类的拓展方法 h 和i 怎么办呢,难道必须重新写一个方法polymorphic(Child p)?
}
public static void main(String[] args){
ParentSub2 ps = new ParentSub2();
Parent2 p = new Child2();
ps.polymorphic(p);
}
}
我想如果在编程过程中Parent方法设计不合理,我想在 polymorphic(Parent2 p) 中调用 子类的方法的话,是不是必须重写一个方法不能利用多态的效果呢?这样多态的效果不是消失了吗?我的理解:是不是只有Child在要使用多态的方法(polymorphic)里完全的使用Parent类的已有方法才行,如果想要使用Child的拓展方法,就不能想在多态的方法里实现,必须重写。 有请其他人士来解决,我下次想到了继续来更新。
java 继承多态的一些理解和不理解的更多相关文章
- Java继承多态中的方法访问权限控制
java中的方法天生具有继承多态特性,这点与C++有很大不同(需要在父类方发上加virtual关键字),但用起来确实方便了许多. 最简单的继承多态 声明一个接口BaseIF,只包含一个方法声明 pub ...
- java继承多态和抽象类接口
一.继承 通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类.已有的称为父类,新的类称为子类(父类派生子类,子类继承父类).(1)继承的优点: ①代码的可重用性: ②父类的属性 ...
- 学习博客之Java继承多态接口
这一篇博客主要是对软工前一阶段学习的总结,主要是对Java的学习总结,包括三部分:Java的继承.多态和接口 Java的继承 继承是面向对象的三大特性之一,能够实现软件的复用. Java子类继承父类的 ...
- java 继承多态的一些理解不和不理解
1.向上转型的一个误区 一直以为Child 继承Parent以后, Parent p = new Child(); p可以调用Child类中拓展Parent的方法,原来必须在强制转换成Child类才 ...
- java继承,多态
子类继承父类,用父类去接收子类,其实我觉得用父类,子类来形容继承关系是不恰当的,比如再发生多态的时候,Car c = new W();w是大众,你能说Car 和W是父子关系吗,我觉得用所属关系类描述可 ...
- Java继承多态
一. 父类引用指向子类对象父类名(接口名) 对象名=new 子类(接口)名称() 二. 父子继承关系中,成员变量重名1.直接通过子类对象访问成员变量 =左边是谁,就优先用谁2.间接通过成员方法访问成员 ...
- java四大特性理解(封装继承多态抽象)
封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象.封装是一 ...
- 关于java中多态的理解
java三大特性:封装,继承,多态. 多态是java的非常重要的一个特性: 那么问题来了:什么是多态呢? 定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行 ...
- java面向对象(封装-继承-多态)
框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...
随机推荐
- Eclipse中Tomcat Server启动后马上又自动停止报错Address已经使用8005端口 Can't assign requested address (Bind failed)
Eclipse中Tomcat Server启动后马上又自动停止报错 Can't assign requested address (Bind failed) ,打开Tomcat Server的配置页面 ...
- mysql 按照时间查询
这篇文章转载自http://blog.csdn.net/wangjuan_01/article/details/51726588 今天 select * from 表名 where to_days(时 ...
- poj做的题
1699 1080 1170 1239(不错) 1659(读读怎么写)
- Java-File类获取目录下文件名-遍历目录file.listFiles
package com.hxzy.IOSer;import java.io.*;/*File 类获取功能 * List * ListFile * */public class Demo06 { pub ...
- java实际项目中interface和abstract interface 区别
参考:https://zhidao.baidu.com/question/424485344260391052.html 这2种有什么区别,根据实际项目经验 帮我解答下 谢谢啊~~~~~~~~~问题补 ...
- var在PHP和JS中的使用
一,var在PHP中的使用 var在PHP中使用很少,只在类中声明成员变量时候,可以使用var,其相当于public,而且以后逐渐用public替代var,所以在PHP中尽量不使用var声明变量. 二 ...
- OWASP JUICE SHOP部分题解
本文作者:S0u1 0×00 简介 OWASP JUICE SHOP是一个开源的web应用靶场,里面包含了共记47个漏洞挑战任务,囊括了OWASP TOP 10的各个点,是一个很不错的渗透测试练手项目 ...
- Linux 重命名
例子:将目录A重命名为B mv A B 例子:将/a目录移动到/b下,并重命名为c mv /a /b/c 其实在文本模式中要重命名文件或目录,只需要使用mv命令就可以了,比如说要将一个名为abc的文件 ...
- PHP性能优化四(业务逻辑中使用场景)
php脚本性能,很多时候依赖于你的php版本.你的web server环境和你的代码的复杂度. Hoare曾经说过“过早优化是一切不幸的根源”.当你想要让你的网站更快运转的时候,你才应该去做优化的事情 ...
- 如何在ASP.NET Core 2.0中使用Razor页面
如何在ASP.NET Core 2.0中使用Razor页面 DotNetCore2017-11-22 14:49 问题 如何在ASP.NET Core 2.0中使用Razor页面 解 创建一个空的项 ...