- 继承 实现 (A is-a B) 也叫作泛化
- 组合 聚合 关联 (A)
- 依赖
继承
子类 => 父类
-
子类继承父类, 通过一个关键字
extends
-
子类可以调用父类允许子类调用的方法/属性
-
子类可以添加一些独有的方法或者属性, 减少代码的冗余
-
子类继承来的方法不一定能满足子类的要求
=> 重写(override)
, 重写意味着改变内部内容, 保留结构. 不同于重载(overload), 重载的例子比如说System.out.print()
方法 -
每一个类都有继承类, 如果没有
extends
显式的继承某个类, 默认继承object
. 它是任何一个引用类型的父类.object
没有父类. 比如
toString()
:public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
getClass()
: 获取对象对应类的类映射
hashCode()
:public native int hashCode()
, 将对象在内存中的地址经过某个算法计算成一个整数
equals()
: 比较两个基本值是否相等, 比较两个引用值的地址是否相等,. 可以进行重写
wait()
: 让线程进入等待状态
notify()
: 唤醒线程
notyfyAll()
: 唤醒所有线程
finalize()
: 权限修饰符是 portected, 对象被GC回收的时候, 默认调用的方法
clone()
: 克隆对象用的.
final, fanally, finalize
区别?
final 是一个权限修饰符
finally 是 try-catch 的最后关键字
finalize 是垃圾回收机制回收对象的默认会调用的方法
- 每个类只能继承一个类, extends后面只能跟一个类的名字, 目的是让类变得更加安全. 如果继承了两个类, 两个类里面都有一个方法叫做
test
, 那么子类调用test
方法的时候, 到底是调用的谁的呢? - 可以使用传递的方式进行多继承,
人 继承 动物, 父亲 继承 人, 儿子 继承 父亲
- 继承在内存中的存储形式
Person p = new Person()
等号左边存在于栈内存, 等号右边存在于堆内存
new Person
的时候, 不但调用了Person
的构造方法, 还调用了Animal
的构造方法.
所以,p.toString()
是先去Person
类里面找, 然后去Animal
里面找, 最后在Object
里面找到. - this 和 super
this 指代当前执行方法时的对象, 不一定是当前类的
super 当前执行方法时的对象的父类
public class Animal {
public String name;
public void eat(){
System.out.println("动物吃饭");
}
public void sleep(){
this.eat();
System.out.println("动物睡觉");
}
}
子类在调用sleep
方法的时候, 会执行this.eat()
, 但是这个 eat()
是子类的方法, 而非是父类的.
网友评论