继承、多态、组合

一、简介

extends——“is-a”(是一个)的关系是用继承来表达的;

“has-a”(有一个)的关系是用组合来表达的。

“对外一个接口,内部多种实现”——多态(运行时多态和编译时多态(重载实现))

二、关于继承

子类到底继承了父类的哪些成员(根据访问修饰符来判断):

1):如果父类中的成员使用public修饰,子类继承.

2):如果父类中的成员使用protected修饰,子类也继承,即使父类和子类不在同一个包中.

3):如果父类和子类在同一个包中,此时子类可以继承父类中 缺省修饰符的成员.

4):如果父类中的成员使用private修饰,子类打死都继承不到.因为private只能在本类中访问.

5):父类的构造器,子类也不能继承,因为构造器必须和当前的类名相同.

三、细节问题

1、需求:在子类中的某一个方法中,去调用父类被覆盖的方法.

使用super关键字.    super: 当前对象的父类对象.

this: 当前对象,谁调用this所在的方法,this就是哪一个对象.    

2、子类构造中调用父类构造这句话  super([实参])  ,必须作为子类构造器的第一句话

四、Object

Object类的常见方法:

1): protected void finalize() :当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 垃圾回收器在回收某一个对象之前,会先调用该方法,做扫尾操作. 该方法我们不要去调用.

2): Class getClass() :返回当前对象的真实类型。

3): int hashCode(): 返回该对象的哈希码值,hashCode决定了对象再哈希表中的存储位置,不同对象的hashCode是不一样的.

4): boolean equals(Object obj) :拿当前对象(this)和参数obj做比较. 在Object类中的equals方法,本身和 “ == ”符号相同,都是比较对象的内存地址. 官方建议:每个类都应该覆盖equals方法,不要比较内存地址,而去比较我们关心的数据.,因为我们关系的是内容数据,而不是内存地址. 比如:两个学生对象,我们不管是如何new出来的,只要学号相同我就应该认为是同一个对象. 两个字符串,只要内容相同,我们就认为是同一个字符串.

5):String toString():表示把一个对象转换为字符串. 打印对象时,其实打印的就是对象的toString方法. System.out.println(obj对象);等价于 System.out.println(obj对象.toString()); 默认情况下打印对象,打印的是对象的十六进制的hashCode值,但是我们更关系对象中存储的数据. 官方建议我们:应该每个类都应该覆盖toString,返回我们关心的数据.

五、多态

多态的作用:把不同的子类对象都当作父类类型来看待,可以屏蔽不同子类对象之间的实现差异,从而写出通用的代码达到通用编程,以适应需求的不断变化。

即在运行时刻,根据变量指向的具体类型(父类or子类)确定调用的方法是在父类or子类中的实现。

运行时多态,晚联编实现

将一个方法调用和一个方法体连接在一起,就称为联编。

在程序运行之前执行联编操作,则成为早联编。在运行时刻执行联编就称为“晚联编”。

在晚联编中编译器不知道对象的类型,但在运行时刻的方法调用机制   能够自己确定并找到正确的方法体。

java中,除了定义为final的方法,其余所有方法的联编都采用晚联编技术。

你可能感兴趣的:(继承、多态、组合)