动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.休闲程序空间:趣说java处理异常的.
.Java 2005回顾&2006展望.
.使用Resin3.0配置运行Java Servl.
.通过 Java 如何实现 AES 密码算法.
.J2EE项目中如何组建开发团队.
.包版本标识.
.继承“protected”.
.配置shark与mysql的连接.
.《java与模式》读书笔记 ----模式.
.Convert from type X to type Y.
.针对hibernate,jdbc,sql的思考.
.在.NET框架中保留应用程序设置.
.用J2ME编写手机短消息发送程序.
.JavaWebStudio 2005新感觉.
.在Java中解读压缩文件.
.BEA的Workshop Studio开发者.
.灵活使用EJB的本地和远程接口(四).
.JDK1.3中的本地绘制支持.
.Java中Decorate的三种实现方法.
.Java核心代码例程之:HelloWorld.

我看多态——多态的学习笔记

发表日期:2008-1-5 |



  发现好多初学的朋友对多态部分总是比较模糊,小弟今天在看朋友的学习笔记的时候也发现这个问题,所以借我朋友笔记上的问题,发表一下自己的看法,先假设有继续关系如下的类: 代码:
  
  Animal
  
  Mammal
  
  ---------------------------------------------------------------
  
  Dog Cat Raccoon SwampThing
  (implements (implements
  Washer) Washer)
  ? interface Washer {}
  ? class Animal {}
  ? class Mammal extends Animal {}
  ? class Dog extends Mammal {}
  ? class Cat extends Mammal implements Washer {}
  ? class Raccoon extends Mammal implements Washer {}
  ? class SwampThing extends Mammal {}
  
  下面的为对这几个类的应用和我朋友的笔记:
  
  public class Test14 {
  public static void main(String[] a) {
  //----------------------------------
  Dog rover,fido;
  Animal anim;
  rover =new Dog();
  anim=rover; //理解成Animal anim = new Dog();
  fido =(Dog)anim; //这段话能够通过编译和运行!!!!!
  //fido =anim;不能通过编译
  //----------------------------------
  Washer wawa=new Cat();
  SwampThing pogo;
  pogo=(SwampThing)wawa;
  //这句话能够通过编译,但不能运行
  //两个毫不相干的类对象,居然能够通过编译?
  //经另外测试,任意两个不相干的类对象cast是会出现编译错误的,
  //所以,上面的类可能是继续了同一个类的缘故?
  
  我的解释:
  首先,我们知道,超类类型的变量可以引用一个子类类型的对象,即
  代码:
  Animal anim = new Dog();
  这样是完全可以的,但是要注重的是编译器只检查且承认定义时候的类型,所以这样定义并赋值的anim变量不能调用Dog类中特有的实例字段和方法,这就是我们通常所说的隐藏,假如我们仍然要用到这些被隐藏的东西怎么办呢,那就是后面我们看到的笔者认为费解的那句:
  代码:
  fido =(Dog)anim;
  其实这样只是恢复了被隐藏的功能,并不是把超类对象赋给子类变量,当然,编译器并不管最终这个造型转换能否成功,编译器现在只知道你在把一个Dog型的对象赋值给一个Dog型的变量,这当然没有问题,同样,后面的这样3句
  代码:
  Washer wawa=new Cat();
  SwampThing pogo;
  pogo=(SwampThing)wawa;
  
  也很好理解,编译器只知道你在试图把一个SwampThing型的对象赋值给一个SwampThing型的变量,这当然没问题,注重对象wawa原来是什么类型编译器并不管(这句话并不全面,具体见下面),它只知道不管什么类型已经强制转换成了SwampThing型,至于这种转换会否成功则会在运行时判定,假如不能成功转换当然会抛出异常,这就是为什么总说造型前请用instanceof判定对象本身是否属于要转换的类!
  让我们探讨的再深一点:
  注重笔者上边最后注释的话是不对的,
  Cat类与SwampThing类不是毫不相干的,它们都实现了Washer接口,注重变量wawa被定义的类型并不是Cat类型,而是Washer接口类型,所以
  代码:
  pogo=(SwampThing)wawa;
  
  这句话才有可能成功,假如变量wawa被定义为Cat类型,则上面的造型绝对不可能成功,即编译也无法通过!由此我们知道,编译器也会为造型做出判定,不过编译器只会判定被造型的对象有没有可能被造型成功,就象上面的代码,wawa定义的时候是Washer类型,任何实现了这个接口的类的对象都可以被wawa引用,而SwampThing类也实现了这个接口,所以当编译器执行到上面的代码时,编译器只通过对wawa的定义检查,认为wawa有可能指向SwampThing类型的对象,这个造型有可能成功,所以可以被编译成功!
  还可以再深一点讨论:
  上面例子中笔者注释了这么一句话:
  //fido =anim;不能通过编译
  通过阅读之前的代码我们知道变量anim指向的实际对象和fido的定义类型是一致的,都是Dog,但是不能编译,这是因为编译器只检查anim的定义,发现是Dog的超类,所以我们必须要先类型转换,但是假设可以通过某种方法强制通过编译,那么这句话运行时反而没有问题因为实际类型是匹配的,这种情况可以说正好与上面讨论的能通过编译但是运行出错的情况相反!
  总结:正是Java中编译器只检查定义类型,运行时检查实际类型的双重检查方式造成了面向对象中多态这种即规范同时又非常有灵活性的机制
上一篇:澄清Java语言接口与继承的本质 人气:502
下一篇:String类的intern内部化方法释疑 人气:672
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-10 企业网站智能管理系统(TZIMS) v6
2008-10-10 拓文asp.net网站内容管理系统 v6
2008-10-10 动网论坛PHP版 v2.0++ Build 081
2008-10-10 免费时代CMS v5.0
2008-10-10 wodig第四季中文DIGG社区 v4.1 b
2008-10-10 老Y文章管理系统 v2.2 bulid 081
2008-10-10 魔法盒动感相册 ASP+SQL版 v2.0
2008-10-10 Asoft签到管理系统 v3.0 Pack1
2008-10-10 哥特人音乐网潮流留言本 v1.1
2008-10-11 联系人分组工具 v1.1 中文破解版
2008-10-11 FaceMelter变脸 v2.0 汉化破解版
2008-10-11 PathTracker道路跟踪仪 v1.2 破解
2008-10-11 Rooms手机聊天室 v0.6.7 破解版
2008-10-11 RemoteDesktop远程桌面 v1.0 破解
2008-10-11 ProRemote远程调音台 v1.0.1 破解
2008-10-11 PicShare照片共享 v1.0.0 破解版
2008-10-11 Photogene照片编辑器 v1.5 汉化破
2008-10-11 WriteRoom共享文档 v1.0 破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成