动态网站制作指南 [  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中如何模拟多继承.
.用Apache Img Tag生成随即验证图.
.SCJP模拟题104道.
.J2SE的30个基本概念.
.JavaScript与JavaApplet的综合运.
.强!Java实现MSN Messenger聊天.
.用Java开发企业级无线应用(1).
.Java数据库编程中查询结果的表格.
.WebLogic树形结构的实现.
.关于 MVC 模式中的通知机制.
.基于Java线程实现后台定时监控.
.java.net 操练.
.Java进阶:在SE6中调用编译器的两.
.在applet中使用JDBC的一点总结.
.Java中设计模式(2)Singleton模式.
.[JAVA100例]062、多线程.
.J2EE应用系统内部的Web Services.
.学习Jakarta Struts 1.1 (二).
.阴阳历算法.

JAVA中动态性实例解释

发表日期:2008-1-5 |



  //下面我结合实例解释一下Java中动态性实现问题
  class base
  {
  public int ageOfBase=10;
  
  public void display()
  {
   System.out.println("display() in base!");
  }
  
  public void display1()
  {
   System.out.println("display1() in base!");
  }
  
  private void show()
  {
   System.out.println("show() in base!");
  }
  }
  
  class test extends base
  {
  public int ageOfTest=10;
  
  /*这个函数改写父类方法
   但是他并不是简单完成自己的功能;
   在实现自己的应该实现的功能同时他还保留了父类的功能
   *************************************
   重要的是假如你没有改写这个父类方法的话, 子类test还是存在这样的方法的,只是存在的方法实际上是从父类继续来的,只是简单的实现父类实现的功能。
  */
  public void display()
  {
   System.out.println("display() in test!");
   super.display();
  }
  
  //注重我并没有改写方法display1(),但是这个方法由于继续的原因
  //子类test中还是存在的
  
  //我写一个新的方法为子类
  public void display2()
  {
   //这里引用父类的私有方法
   //这个方法在子类中并不存在的
   //但是一定要记住:
   //访问父类的私有成员是不答应的
   //super.show();
  
   //这里引用父类的共有方法
   //实际上这里引用是子类中的方法
   //因为这个方法已经从父类继续了
   display1();
  
   //下面这样引用也可以的
   //这里是真正引用父类的方法的
   // super.display1();
  
  
   //上面这一点可能讲的不是很清楚的
   //下面我换一种例子
  
   //这个是子类的
   display();
  
   //这个是父类的方法
   super.display();
  
   System.out.println("display2()in test!");
  }
  
  public static void main(String args[])
  {
   test t=new test();
   base b=new base();
   //下面这一句是多态性的根本
   //一个父类的引用指向子类
   b=t;
  
   //这样通过父类的引用调用方法的话
   //实际上是执行子类中实现的方法
  
   /*
   下面我结合我对面向对象编程的把握和研究情况谈一下我的经验和看法其间我不能保证我说的每一点都正确,只是给你参考对于多态性这个面向对象编程领域很重要的概念。我结合c++以及针对java中的实际情况做几点说明。
  
   (1)最好对于虚拟指针以及虚拟指针表格有一定了解。不了解的话,你只能是记住我说的,但是不一定能理解很好。
  
   (2)父类引用指向子类。方法调用的时候执行的是子类的方法。这个说法是有很多前提和意外的。
   下面我举一个例子
   */
  
   b.display();
  
   // 下面调用会出错的
   //t.display2();
   //应该象下面那样
   ((test)b).display2();
  
   int temp1=b.ageOfBase;
  
   // 下面调用会出错
   //int temp2=t.ageOfTest;
   //应该向下面那样
   int temp2=((test)b).ageOfTest;
  
  
   /*
   现在解释上面两个会出错的原因,这个原因是动态性的根本所在。
   我尽力能解释清楚一点。
  
   **************要害一********************
  
   因为父类和子类的对象在内存中的大小是不一样的,当然了不同的对象本身就不可能是同一块内存地址的。
   这个应该没有问题的吧,当然了要是子类中只是简单的继续而没有都没有做的话,可能是一样的,但是在c++中各家编译器还有会有一点差异的,可能也会不一样的。
  
   ***************要害二************************
  
   引用本质上是通过指针来实现的,更深入一点是引用是指向指针的指针,而不同类型的指针所治理的内存空间大小是不一样的,这一点跟上面联系很紧的。注重这里是说指针治理的内存而不是指针,我想大家都
   知道指针只有4个字节长度的。这里我们可以简单的说是变量的可见性问题,因为变量虽然存在但是并不一定是可见的。
  
   ***************要害三************************
  
   多态性的要害是动态绑定,说白了就是虚拟函数虚拟指针虚拟指针表等几个重要的概念。简单讲一下,这里很复杂的,但是每一个真正的面向对象编程人员必须花时间很好的理解这一点。java 中只有静态函数和虚拟函数两种,c++中还有一种 非静态非虚拟函数。所以java的动态绑定要轻易一点的。 你可以不精确的这样理解(因为解释精确我也很懒,可以写很长的文章了),每次类编译的时候都会生成一个虚拟函数表,表里面保存自己类中所有的虚拟函数地址,同时要是这个类存在父类 (不管是extends class 还是implements interface)的话,同时他会把从父类继续来的虚拟函数表也继续过来(这里我只是大概解释,不是很准确)。
   这个地方请注重:
   ************************************************
   要是子类没有改写父类继续的方法,父类虚拟函数中对应虚拟函数地址被变成子类自己的虚拟函数地址;假如没有改变则不需要改变继续来的虚拟函数表对应函数的地址。
   *************************************************
  
   ***************开始解释************************
   当父类引用指向子类对象的时候,父类引用治理的内存空间,是要比子类真实的内存空间小的。所以子类中比父类中多的东西对于这个父类引用来说是不可见的。所以也就没有办法引用。
  
   上面的那个变量引用和函数引用就是这样的,因为父类中没有变量ageOfTest和函数display2()的。但是我们可以知道父类指针实际上是指向子类的,所以我们解决这个问题的方法就是:强制转换类型(java中叫造型)。
  
   同时可能有人要问,子类中那个函数地址不是也在虚拟函数表中吗?很兴奋你问这样的问题,但是父类引用看到的虚拟函数表是没有那个函数项目的,因为他对于父类引用绝对是不可见。
  
   对于另外一个虚拟函数调用,假如你看了说明很仔细的话,你现在一定知道虽然是父类引用治理内存范围小,但是那个虚拟函数表,父类中有的,但是由于函数被子类中改写了,所以那个表中函数地址编程子类的拉,当然就是引用子类的方法了。
  
  
   /****************重要补充************************
   java中静态函数是没有动态性,因为静态函数不能被继续,也不能被改写为非静态方法。因为静态就意味着类的所有实例共享一个实体。
   **************************************************
   */
  }
  }
上一篇:JAVA应用问答 人气:394
下一篇:一起来学Java吧 人气:491
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-9-6 Movie34电影搜索引擎 v3.0
2008-9-6 wap2.0仿帝国建站喜用 v2.0
2008-9-6 免费人才招聘网 宽屏版 v3.01
2008-9-6 喜喔喔视频采集程序 v1.0 beta
2008-9-6 ASP客户管理系统
2008-9-6 主流驿站中秋祝福程序
2008-9-6 php实现msn协议的类
2008-9-5 Coppermine Photo Gallery v1.4.
2008-9-5 清松网络日记本 v2.4
2008-8-23 Mini WinMount V0.4
2008-8-23 Vista优化大师3.11正式版
2008-8-23 Wine 1.13
2008-8-23 KlipFolio 5.0 Build 5899-80
2008-8-23 Windows Sysinternals Desktops
2008-8-23 OneTap Movies1.2破解版
2008-8-23 AnnotaterPDF阅读1.1.503 破解版
2008-8-23 SoundMeter分贝测量仪 v1.0汉化破
2008-8-23 iDrum音乐节拍1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | Html转换js | js/vbs加密 | md5加密 | 进制转换
实用工具:汉字翻译拼音 | 符号对照表 | 个税计算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号