1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Java札记

Java札记 1.Java静态绑定和动态绑定 1.1静态绑定: 静态绑定就是所谓的程序编译时绑定,java中的变量都是静态绑定的,方法只有static和final(所有private默认是final的,子类不可能修改父类的私有方法)是静态绑定的。编译时已经确切知道程序所要执行的是哪一个类的哪一个方法,不存在重载等问题。 例如:static、private修饰的方法或者变量,对于方法的调用或者变量的使用是不存在歧义的,所以在编译时即可确定。 1.2动态绑定: 动态绑定运行时绑定,编译时不知道程序所引用的对象只有在程序执行时才能确定。 例如:Parent p=new Child(),父类中的public方法,如果在子类中进行了重载,声明的父类引用实际上绑定的是子类的对象,在使用父类中被重载的方法时,其实指向的是子类中的方法,这一点只能在程序被运行到才能确定。 1.3 向上转型、向下转型: ·Java向上转型是安全的,而向下转型是不安全的。 ·对于向上转型(Java多态的体现),给父类的引用绑定上子类的对象,父类中的非private属性以及方法在子类中都得到了继承。在向上转型的过程中并不会丢失父类的属性(static/private的属性或者方法在声明对父类的引用时已经确定),所以这个过程是安全的。当程序执行时,父类被重载的方法会动态绑定为子类的方法(若子类中未进行重载,执行的将是父类的方法)。由于向上转型声明的是对父类型的引用,所以在向上转型会丢失掉子类定义的非重载的方法(其实是隐藏了,可以通过instanceof进行向下转型的检查,进行cast来重新获取对子类特有方法的调用)。 ·对于向下转型是不安全的,这一点很显然,声明子类的引用却动态绑定上了父类对象(因为是动态绑定,所以这一类型转换错误只会在执行时发现),子类中定义的变量或函数,父类中是不可能拥有的。但是对于向上转型的逆过程这一安全性问题又可以得到解决,因为堆里保存的对象本身就是子类对象。 Parent p=new Child(); if(a instanceOf Child) (Child) p;//向下转型安全 注:Java是oop语言,不同于C++(为了兼容C),java的所有类都继承了Object。Java中的某些容器存储的对象也是通用类型Object,由于Java继承的单根结构,所以容器可以存储所有类型的对象(向上转型)。但是从容器中取出对象时需要进行向下转型(除非想取到Object对象),这个过程就需要用到向下转型,而这里存在了不安全因素,程序会进行向下转型的检查,会造成额外开销,所以养成良好的编程习惯,在使用容器时指定容器存储的对象类型。 2.GC垃圾回收 2.1对象存储 Java不同于C++,C++对象通常需要通过调用析构函数进行对象的释放,这与C++采用的堆栈方式存储对象机制相关(当然C++还提供了其他的方式),对象的存储与释放对应堆栈的push/pop,采用这种方式对象的创建以及释放会很快速,然而却限制了程序的灵活性,因为对象内存分配得在程序执行前就得确定,并且如果忽略了对象的释放常常会导致内存泄漏。 Java的对象存储是利用的堆机制,Java程序在编译时会创建对象的引用(对象引用可以是堆栈存储),在程序执行时如果需要创建对象,则在程序所分配的堆中创建这样一个对象。Java堆类似于一个池,而且对象的存放是紧凑的(这样对于内存分配以及是释放都有好处),当创建一个对象时,会根据当前的堆“指针”查找到堆中的空闲区域,然后向后分配给这个对象内存空间,分配后修改“指针”位置。从这个角度上讲Java对象的创建和C++的堆栈存储对象效率上并没什么区别,但是Java并不要求程序员人为的完成对对象的释放,而堆的空间是有限的如何合理的分配堆释放那些无用的对象就需要使用到Java的垃圾回收了。 2.2垃圾回收 2.2.1Java的GC是一种“停止——复制、标记——清理、分代、自适应”的垃圾回收。 2.2.2GC原理: 首先GC发生的时间,一般有两种一种是内存不足、另一种是空闲时,因为垃圾回收需要暂停程序执行,需要系统开销,所以不到一定时候不会进行垃圾回收。对于垃圾回收原理,当程序的heap空间不足时,gc发生,需要对那些不再被引用的“死”对象进行释放,进行垃圾回收首先需要跟踪对象的引用以确定哪些对象可以被释放哪些不可以被释放。JVM会根据堆栈中存放的对象引用,到heap中查找响应的对象,因为对象的创建是在new的时候发生,我们无法事先知道一个对象的生命周期,但是我们可以找到对对象的所有引用,当对该对象的所有引用都结束后,对象其实就可以进行释放。对于对象内部引用对象的情况,只需要按照“引用—对象—引用…”的方式一直找下去即可完成对所有对象的跟踪。这样完成了对“垃圾”的查

文档评论(0)

asd522513656 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档