继承多态绕点 Java篇
上一篇把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篇的更多相关文章
- 继承多态绕点 C#篇
最近在看博客的时候看到一块很绕的地方,有点类似于以前学习C语言是的i++,++i组合到一起使用的情况,很坑b的,绝对会比i++,++i这种情况更有用,虽然实际代码里面确实很少出现. 面对象像三大特点不 ...
- python面向对象(封装,继承,多态)
python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...
- 学习博客之Java继承多态接口
这一篇博客主要是对软工前一阶段学习的总结,主要是对Java的学习总结,包括三部分:Java的继承.多态和接口 Java的继承 继承是面向对象的三大特性之一,能够实现软件的复用. Java子类继承父类的 ...
- java面向对象(封装-继承-多态)
框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...
- java类的封装 继承 多态
1.猜数字小游戏 package cn.jiemoxiaodi_02; import java.util.Scanner; /** * 猜数字小游戏 * * @author huli * */ pub ...
- [Java]重载,重写以及继承,多态的区别
转自:http://android.blog.51cto.com/268543/53181 什么是多态?它的实现机制是什么呢?重载和重写的区别在那里?这就是这一次我们要回顾的四个十分重要的概念:继承. ...
- Java继承多态中的方法访问权限控制
java中的方法天生具有继承多态特性,这点与C++有很大不同(需要在父类方发上加virtual关键字),但用起来确实方便了许多. 最简单的继承多态 声明一个接口BaseIF,只包含一个方法声明 pub ...
- Java三大特性(封装,继承,多态)
Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...
- Java开发知识之Java的继承多态跟接口*
Java开发知识之Java的继承多态跟接口 一丶继承 1.继承的写法 在Java中继承的 关键字是 extends 代表一个类继承另一个类. 继承的含义以及作用: 继承就是基于某个父类的扩展.制定出来 ...
随机推荐
- hdu 5673 Robot 卡特兰数+逆元
Robot Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem D ...
- 高效使用Vector
参考网页: http://www.cnblogs.com/biyeymyhjob/archive/2013/05/11/3072893.html#undefined 1.初始化的时候,最好先用rese ...
- 加快Win7整体运行速度的12个小技巧
在整体运行速度方面,微软Windows 7系统超越了它的前任Vista,拥有明显的提升;但是相比最新的Windows 8,似乎又有所不及,至少很少有Windows用户能够体会到15秒的开机速度.虽然如 ...
- MYSQL中的SELECT查询时进行运算
SELECT在mysql中是查询表中的数据的作用,但也可以在查询的时候直接进行运算,然后返回查询后的结果 比如 )) FROM username2 其中的IFNULL函数是对adven数据进行判断,若 ...
- bootstrap学习笔记<九>(菜单,按钮。导航基本元素)
有了bootstrap作导航不再麻烦,几个样式,几个标签就能轻松搞定. 下面就来分解学习导航条的制作. 一.首先是下拉菜单 <div class="dropdown"> ...
- 关于mysql的基础知识
一.数据库的简介 什么是数据库? 数据的仓库,如:在atm的实例中我们创建一个db目录称之为数据库 什么是 MySQL.Oracle.SQLite.Access.MS SQL Server等 ? 他们 ...
- PO BO VO DTO POJO DAO 概念及其作用
PO BO VO DTO POJO DAO 概念及其作用(附转换图) 博客分类: java javadaovopojobo J2EE开发中大量的专业缩略语很是让人迷惑, 特别是对于刚毕业 ...
- 实例级别和类级别的static、构造函数、字段属性的简单介绍
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 实例级别 ...
- Spring MVC 之输入验证(六)
Spring MVC 验证主要还是用的是hibernate的验证.so需要添加以下的jar包: 1. hibernate-validator-5.2.2.Final.jar 2.hibernate-v ...
- 年轻人你活着不是为了看K线!
年轻人你活着不是为了看K线! 在网上看到一篇文章,写得还不错,转给大家看一下,内容如下: 这篇文章本来是该几年前写的,奉劝大家不要去玩股票.因为那个时候我的<中国崛起的经济学分析>这本 ...