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 继承多态的一些理解不和不理解的更多相关文章

  1. Java继承多态中的方法访问权限控制

    java中的方法天生具有继承多态特性,这点与C++有很大不同(需要在父类方发上加virtual关键字),但用起来确实方便了许多. 最简单的继承多态 声明一个接口BaseIF,只包含一个方法声明 pub ...

  2. java继承多态和抽象类接口

    一.继承 通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类.已有的称为父类,新的类称为子类(父类派生子类,子类继承父类).(1)继承的优点:    ①代码的可重用性:    ②父类的属性 ...

  3. 学习博客之Java继承多态接口

    这一篇博客主要是对软工前一阶段学习的总结,主要是对Java的学习总结,包括三部分:Java的继承.多态和接口 Java的继承 继承是面向对象的三大特性之一,能够实现软件的复用. Java子类继承父类的 ...

  4. java 继承多态的一些理解和不理解

    1.向上转型的一个误区 一直以为Child 继承Parent以后, Parent p = new Child();  p可以调用Child类中拓展Parent的方法,原来必须在强制转换成Child类才 ...

  5. java继承,多态

    子类继承父类,用父类去接收子类,其实我觉得用父类,子类来形容继承关系是不恰当的,比如再发生多态的时候,Car c = new W();w是大众,你能说Car 和W是父子关系吗,我觉得用所属关系类描述可 ...

  6. Java继承多态

    一. 父类引用指向子类对象父类名(接口名) 对象名=new 子类(接口)名称() 二. 父子继承关系中,成员变量重名1.直接通过子类对象访问成员变量 =左边是谁,就优先用谁2.间接通过成员方法访问成员 ...

  7. java四大特性理解(封装继承多态抽象)

    封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象.封装是一 ...

  8. Java开发知识之Java的继承多态跟接口*

    Java开发知识之Java的继承多态跟接口 一丶继承 1.继承的写法 在Java中继承的 关键字是 extends 代表一个类继承另一个类. 继承的含义以及作用: 继承就是基于某个父类的扩展.制定出来 ...

  9. 关于java中多态的理解

    java三大特性:封装,继承,多态. 多态是java的非常重要的一个特性: 那么问题来了:什么是多态呢? 定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行 ...

随机推荐

  1. 自动化脚本过程中出现This element neither has attached source nor attached Javadoc...的解决方法

    This element neither has attached source nor attached Javadoc and hence no Javadoc could be found Ec ...

  2. Visual Studio 2013 编译CEF步骤

    If you'd like to build the Chromium Embedded Framework (a wrapper for Chromium, for creating browser ...

  3. (转)这个API很“迷人”——新的Fetch API

    原文:https://hacks.mozilla.org/2015/03/this-api-is-so-fetching 原标题是This API is So Fetching,Fetching也可以 ...

  4. PIC32MZ tutorial -- Timer Interrupt

    An interrupt is an internal or external event that requires quick attention from the controller. The ...

  5. js图片变换

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. Deep learning with Theano 官方中文教程(翻译)(四)—— 卷积神经网络(CNN)

    供大家相互交流和学习,本人水平有限,若有各种大小错误,还请巨牛大牛小牛微牛们立马拍砖,这样才能共同进步!若引用译文请注明出处http://www.cnblogs.com/charleshuang/. ...

  7. format when printing

    http://msdn.microsoft.com/en-us/library/vstudio/56e442dc.aspx %[flags] [width] [.precision] [{h | l  ...

  8. MySQL表分区技术

    MySQL表分区技术 MySQL有4种分区类型: 1.RANGE 分区 - 连续区间的分区 - 基于属于一个给定连续区间的列值,把多行分配给分区: 2.LIST 分区 - 离散区间的分区 - 类似于按 ...

  9. asp.net GDI+绘制矩形渐变

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  10. 一个继承TList的例子

    类声明部分: TDMSTrains = class(TList) private FHashed: Boolean; FHashList: TFpHashList; FOwnsObjects: Boo ...