java核心卷之继承学习笔记,你真的懂继承了吗

来源:互联网 发布:三亚市人民政府的域名 编辑:程序博客网 时间:2024/05/16 08:39

——每天的寥寥几笔,坚持下去,将会是一份沉甸甸的积累。

——大三了,该拼一拼了。


下面这几个点如果你都不知道,你敢说你学过java吗?你好意思说学过继承吗?

嘿嘿,废话不多说,进入正题


1.this和super

this是引用,可以作为参数赋值;

super不是引用,不能将super赋给一个变量,它只是指示编译器调用超类的方法。


2.多态和动态绑定

多态:一个对象变量可以指向对个不同类型的现象。

动态绑定:运行时自动确定调用哪个方法的现象。

动态绑定调用的全过程:(如果方法为private,final,static则采用静态绑定,编译时已经索引好具体调用的地址)

- 编译器查看对象的声明类型和调用的方法名,然后一一列举出声明类型和该类型的超类中同方法名的所有方法(超类中的需要是public属性的);

- 根据调用方法的参数,选择合适的一个函数(合适指的是类型完全相同或者自动转换类型后符合)。如果没找到那么直接报错。

- 虚拟机确定对象的实际类型,寻找该类型下的合适方法调用,如果没找到则到超类中去找。


3.final类和方法

final方法:子类不能覆盖。

final类:不能被继承,其中的方法也都是final类型,但类中的域会跟着也成为final类型。


4.强制转换与instanceof方法

强制转换失败会抛出异常ClassCastException,所以建议先进行能否转换测试,即

if(a instanceof ClassA){A = (Class)a;}

5.equals方法的覆写原则

在默认object类下的equals方法比较的是一个对象与另一个对象是否有相同的引用。

当我们覆写equals时,为了提高比较效率,或者说作为一个专业的coder,建议用下面规范的顺序比较:

public boolean equals(Object otherObj){if(this == otherObj) return true;//如果是这种情况,则两对象必然相等,无需其他比较if(null == otherObj) return false;//在this!=otherObj的情况下,如果null==otherObj,那么必然返回falseif(getClass() != otherObj.getClass())return false;//如果超类不同也必然不等//最后用自定义的方法比较。这时已通过上面三轮测试,相等通过的几率大大提高,提高整体效率return this.id == ((XXX)otherObj).id;//return里面的判断内容完全视情况自定义,这里只给出一个示例,记得类型转换}

6.hashcode和equals


首先明确:java中的设计要求规定,equals相等的,hashcode必然相等。

因为在某些集合中是不允许出现相同的元素a和b的,如hashset集合。而判断相同元素,集合会先判断两个对象的hashcode是否相同(因为hashcode不相等,a.equals(b)必然不成立,这样更高效),当hashcode相等时然后再比较equals方法。所以,如果equals相等,而hashcode不等的话,就有可能让两个相同的元素同时放到了集合,出现矛盾。

因此,每次重写了equals方法后,要养成重写hashcode的习惯,不然一旦牵扯相关特殊集合时会出错的。

注:hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值。当被存储到集合中,比如hashset中时,会将其hashcode压缩,压缩到hashset的索引范围内。至于hashing(散列),那是一种可以让我们在平均情形下获得常数级别的查找数据和存储数据的时间性能的技术。


7.object的toString方法

object的toString方法一般默认输出类型+地址或域值,一般都建议覆写成自定义输出。


8.数组列表和数组

new ArrayList<>(100)//表示有存储100个对象的潜力,实际上,现在一个也没存进去。

new int[100]:表示开辟了一个100个连续的内存空间,并默认初始化

前者通过toArray转换成后者


9.IntHolder的使用

java方法是值传递的。因此下面的方法将无法达到目的

public static void triple(int x){x = 3*x;//doesnot work}public static void triple(Integer x){x = 3*x;//doesnot work}*********想要写一个改变数值参数的方法,就需要使用org.omg.CORBA中的holder类型******public static void triple(IntHolder x){x.value = 3*x.value;//ok}


题外话.array与arrays,object和objects等一个比另一个多一个‘s’,但意思和用法完全不一样。

array是集合框架类,而arrays是一个集合辅助类。

Object是所有的父类,而objects是util包下的一个工具类。

还有不少类似的,多注意下即可。


暂时写到这,要上课去了,,,,苦逼。


0 0
原创粉丝点击