上一篇把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. ARM家族大检阅

    首先列举下几个名称: 6410 2440 210 A8 ARM9 ARM11 ARMv7 ARMv6 进行分类: 1.芯片名称: 2440 6410 210 2.ARM核: A8 ARM9 ARM11 ...

  2. NPOI大数据分批写入同个Excel

    实现过程: 要导出来的数据库数据量很大,一次取出来压力有点大,故分批取出来,导入到同一个Excel. 因为Excel2003版最大行数是65536行,Excel2007开始的版本最大行数是104857 ...

  3. Android——GridLayout

    转载自http://www.cnblogs.com/over140/archive/2011/12/08/2280224.html 欢迎大家转载 前言 本章内容android.widget.GridL ...

  4. bzoj 1202: [HNOI2005]狡猾的商人 并查集好题

    1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2946  Solved: 1384[Submit][Sta ...

  5. LINQ之路 1: LINQ介绍

    LINQ是.NET Framework 3.5的新特性,其全称是 Language Integrated Query,即语言集成查询,是指将查询功能和语言结合起来.从而为我们提供一种统一的方式,让我们 ...

  6. LTE Module User Documentation(翻译3)——仿真输出

    LTE用户文档 (如有不当的地方,欢迎指正!) 6 仿真输出 ns-3 LTE 模型当前支持输出 PHY, MAC, RLC 和 PDCP 级别的 Key Performance Indicators ...

  7. 优秀c++开源项目集合

    本文会持续更新, 我希望通过这篇文章把我看到过的优秀开源项目记录下来, 有时间仔细阅读. cockroachdb 前googler开发的开源的spanner数据库: https://github.co ...

  8. (转)jQuery轻量级响应式图片轮播插件ResponsiveSlides.js(仅1kb)也可以做纯文本轮播

    ResponsiveSlides.js是一个展示同一容器内图片的轻量级响应式jQuery幻灯片插件(tiny responsive slideshow jQuery plugin).它支持包括IE6在 ...

  9. caffe的data_reader.cpp分析一下干了点什么

    首先说明:下面的内容不一定对 类body: 变量:LayerParameter param_ :它里面放的是:body传进来的layerparameter的参数: BlockingQueue<s ...

  10. ListFragment

    ListFragment http://developer.android.com/reference/android/app/ListFragment.html extends Fragment C ...