一、简介
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的方法,其余所有方法的联编都采用晚联编技术。
网友评论