上一篇把C#语言的继承,多态里的特殊的情况做了一下总结,其实那一部分代码都是从Java翻译过去的,今天来总结一下Java在这种情况下是怎么调用的。

上一篇我们说的是:
1.多态,只在多态系里方法调用,很简单,先调重写方法,如果没有再调父类的虚方法。
2.非多态,只自声明时类型,先调自身的方法(比如非继承普通方法,new修饰的方法),如果没有再看继承来的方法,最后再看多态系方法(也就是重写了的方法)

但是Java里做了测试,这个规律不适用,下面是测试代码

  public class Shape {
} public class Rectangle extends Shape {
} public class Triangle extends Shape {
} public class Father {
public void Draw(Rectangle rect) {
System.out.println("Father.Draw Rect");
} public void Draw(Triangle tri) {
System.out.println("Father.Draw Tri");
}
} public class Son extends Father {
public void Draw(Shape shape) {
System.out.println("Son.Draw Sha");
} @Override
public void Draw(Triangle tri) {
System.out.println("Son.Draw Tri");
}
}

调用代码段

        Father fa = m.new Son();
Son so = m.new Son(); Shape s = m.new Shape();
Rectangle r = m.new Rectangle();
Triangle t = m.new Triangle(); fa.Draw(r);//1
fa.Draw(t); so.Draw(s);//2
so.Draw(r);
so.Draw(t);

//1部分也是满足多态的,所以很简单能看出结果
Father.Draw Rect
Son.Draw Tri
//2部分结果,如下
Son.Draw Sha
Father.Draw Rect
Son.Draw Tri

在多种情况测试下,可以得出Java里面自身方法,继承方法,多态系方法都是同等重要的,没有先后顺序,主要是自身的方法,与继承方法没有先后顺序,当然有了方法重现,也就不会出现继承方法。所以Java里面更好理,只要是非多态里面调用就是这几种方法同等,只要有就会调用,就不会像C#先调自身方法这种情况。所以so.Draw(r)和so.Draw(t) 结果是Father.Draw Rect和Son.Draw Tri,虽然第1个调用自身没有方法,但是有从父类继承来的方法,所以调用。第2个调用有一个重写的方法,因为这几个方法调用顺序平等,所不会调Shape参数的方法,如果没有这个重写的方法就会调继承下来的,如果没有才会调Shape参数的方法。

最后,从这里来看Java要比C#要好理解些,因为没出现virtual,new这些修饰词,统一平等对待。

总结一下:

Java里面 重载,继承的情况下方法的访问顺序

没有顺序,自身方法,继承来的方法,多态系方法一视同仁

如果是满足多态的情就简单,表现多态就行了。

继承多态绕点 Java篇的更多相关文章

  1. 继承多态绕点 C#篇

    最近在看博客的时候看到一块很绕的地方,有点类似于以前学习C语言是的i++,++i组合到一起使用的情况,很坑b的,绝对会比i++,++i这种情况更有用,虽然实际代码里面确实很少出现. 面对象像三大特点不 ...

  2. python面向对象(封装,继承,多态)

    python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...

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

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

  4. java面向对象(封装-继承-多态)

    框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...

  5. java类的封装 继承 多态

    1.猜数字小游戏 package cn.jiemoxiaodi_02; import java.util.Scanner; /** * 猜数字小游戏 * * @author huli * */ pub ...

  6. [Java]重载,重写以及继承,多态的区别

    转自:http://android.blog.51cto.com/268543/53181 什么是多态?它的实现机制是什么呢?重载和重写的区别在那里?这就是这一次我们要回顾的四个十分重要的概念:继承. ...

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

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

  8. Java三大特性(封装,继承,多态)

    Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...

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

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

随机推荐

  1. linux挂载共享文件夹

    挂载windows共享目录或FTP: 方式一:包含密码 Shell代码 收藏代码 sudo mount //192.168.10.22/FTPServer /windows -o username=u ...

  2. ajax请求、servlet返回json数据

    ajax请求.servlet返回json数据 1.方式一 response.setcontenttype("text/html;charset=utf-8"); response. ...

  3. CUBRID学习笔记 3 net连接数据库并使用cubrid教程示例

    接上文 数据库安装好后,也可以测试语句了. 下面我们用c#写一个控制台程序,连接数据库,并读取数据. 一 下载驱动  net版的下 CUBRID ADO.NET Data Provider 9.3.0 ...

  4. 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。

    这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...

  5. yii 中引入js 和css 的方式

    在yii中 我们需要引入css 和 js 的时候,yii 自身有需要的类. 当我在views 视图层中引入css 和 js , <?php Yii::app()->clientScript ...

  6. luabind 导出string问题

    luabind导出字符串 不能导出char* 会有问题 应该是字符串连接的时候出错了 static _TCHAR* pRetChar = new _TCHAR[10]; memcpy(pRetChar ...

  7. 编写spring配置文件时,不能出现帮助信息

    由于spring的schema文件位于网络上,如果机器不能连接到网络,那么在编写配置信息时候就无法出现提示信息,解决方法有两种: 1.让机器上网,eclipse会自动从网络上下载schema文件并缓存 ...

  8. 保存会话数据——session学习

    Session:Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资 ...

  9. ubuntu linux 使用常见问题

    Q:gedit不支持windows下的中文显示 A:http://wiki.ubuntu.org.cn/Gedit%E4%B8%AD%E6%96%87%E4%B9%B1%E7%A0%81 Q:bash ...

  10. Facebook内部分享:25个高效工作的小技巧

    Facebook内部分享:25个高效工作的小技巧 Facebook 内部分享:不论你如何富有,你都赚不到更多的时间,你也回不到过去.没有那么多的假如,只有指针滴答的时光飞逝和你应该好好把握的现在,以下 ...