继承多态绕点 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 代表一个类继承另一个类. 继承的含义以及作用: 继承就是基于某个父类的扩展.制定出来 ...
随机推荐
- ubuntu下解压zip文件乱码
安装unar 即可解决问题 sudo apt get install unar
- day20 FORM补充(随时更新),F/Q操作,model之多对多,django中间件,缓存,信号
python-day20 1.FROM生成select标签的数据应该来源于数据库. 2.model 操作 F/Q (组合查询) 3.model 多对多操作. 4.中间件 :在请求到达url前先会经过 ...
- 小型网站如何防范DDoS攻击
ddos(Distributed Denial of Service,分布式拒绝服务攻击),俗称洪水攻击.是在传统的DoS攻击基础之上产生的新的破坏力更强的攻击方式.分布式拒绝服务攻击是指借助于客户/ ...
- iOS8 获取通知设置状态
UIUserNotificationSettings *settings = [[UIApplication sharedApplication] currentUserNotificationSet ...
- Python学习笔记13—错误和异常
常见的异常:
- iOS开发之 几本书
<object_c 编程之道书> <iOS 7 UI Transition Guide> iOS开发指南:从零基础到App Store上架[国内第一本iOS架构设计图书,涵盖i ...
- hibernate的注解属性mappedBy详解
mappedBy: 1>只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性: 2>mappedBy标签一定是定义在被拥 ...
- [转]Oracle中INITRANS和MAXTRANS参数
每个块都有一个块首部.这个块首部中有一个事务表.事务表中会建立一些条目来描述哪些事务将块上的哪些行/元素锁定.这个事务表的初始大小由对象的INITRANS 设置指定.对于表,这个值默认为2(索引的IN ...
- 自定义MVC Html
自定义ASP.NET MVC Html辅助方法 在ASP.NET MVC中,Html辅助方法给我们程序员带来很多方便,其重要性也就不言自明.有时候,我们不想重复地写一些HTML代码,或者MS没有提供我 ...
- linux环境(CentOS-6.7)下redis集群的搭建全过程
linux环境下redis集群的搭建全过程: 使用mount命令将光盘挂载到/mnt/cdrom目录下: [root@hadoop03 ~]# mount -t iso9660 -o ro /dev/ ...