继承避免了重复

子类继承了父类,就拥有了父类的全部方法和数据。另外,Java是单根继承的,所有的类都继承了Object,这样的好处是保证了Java世界里所有的对象都有同一行为(因为都继承了Object里的方法)。


两个重要的方法

  • Equals()

要比较自定义的对象,只需要覆盖equals()且同时覆盖hashCode;在idea中可以通过快捷键(insert + alt)快速覆盖。同时覆盖hashCode的原因是,hashCode()主要用于hash表,比如hashMap:
当集合要添加元素时,大致按如下步骤:
先调用该元素的hashCode()方法,直接定位到它应该放置的物理位置上
如果这个位置上没有元素,就直接存储在这个位置上
如果这个位置上已经有元素,就调用equals()方法进行比较,相同的话就更新,不相同就使用上述解决碰撞的方法存储新元素

所以重写equals()方法时,也必须重写hashCode()方法。如果不这样做,就会违反Object.hashCode()的规范,导致无法结合所有基于hash的集合一起正常运作,这样的集合包括HashMap、HashSet和Hashtable。

  • toString()

可以对一个对象提供字符串表示,例如当 System.out.println(a) 打印一个对象时, println 自动调用了toString(),当然也可以在类中通过重写实现自定义打印内容。


继承中的类结构与初始化顺序

当一个类继承了父类,这个类就拥有了父类所有的方法和数据。在new这个类时,先初始化父类再初始化子类(具体是在子类构造器中调用父类构造器,使用super()进行调用,父类构造器有参数的还需要带上参数)。
image.png
例如:Cat类继承了Animal类,那么在内存中,新建一个Cat类型的对象,这个对象在内存中就如上图一样,带有父类Animal的全部数据和方法。


实例方法的覆盖

永远使用Override,可以使编译器检查你的方法签名,确认有没有成功重写。
插件:Key PromoterX帮助检查有可以替代的快捷键操作。