类与类之间的关系有:
A is - a 泛化(继承、实现)
A has - a 包含(组合、聚合、关联)
A use - a 依赖(依赖)
继承(is - a)
继承是所有OOP语言不可缺少的部分,在java中使用extends关键字来表示继承关系。当创建一个类时,总是在继承,如果没有明确指出要继承的类,就总是隐式地从根类Object进行继承。
1.子类继承父类(extends)
(1)子类可以继承父类的 public 和 protected 属性和方法当做自己 的来使用,不能够继承 private 成员变量;
(2)子类可以添加自己独有的属性和方法;
(3)如果子类从父类中继承的方法不能满足子类的需要,那么可以在子类中重写(覆盖)父类的方法,更多的是指改变方法内容;
(4)每一个类都有继承类,如果不写 extend 关键字,则默认继承 Object (Object没有父类),如果写了 extend ,则继承extend后的那个父类;
(5)Java中继承是单个存在的(单继承),每一个类只能有一个继承类(即在 extend 后面只能写一个类);
但是可以通过传递的方式实现多继承的效果,
(6)Java在继承中的存储形式
(7)关于 this 和super 的使用
this 和 super 都是指代词,代替的是对象;
this代替的是当前执行方法时的那个对象,不一定是当前类的;
super代替的是当前执行方法时的对象的父类对象;
this 与 super 都可以调用一般属性 和一般方法;
都可以放置在类成员的任意位置(属性、方法、构造、块)
可以调用构造方法(要放在构造方法的第一行);
this和super在构造方法中调用另一个类的构造方法不能同时出现在第一行
构造方法之间不能来回互相调用
子类不能继承父类的构造器(构造方法或者构造函数),但是父类的构造器带有参数的,则必须在子类的构造器中显式地通过super关键字调用父类的构造器并配以适当的参数列表。
public class Animal{ public Animal(){} public Animal(int a){ System.out.println("我是动物的Int型构造方法"); } public void sleep(){ System.out.println("我是动物的睡觉方法"); } public void eat(){ System.out.println("我是动物的吃饭方法"); } } public class Preson extends Animal{ public Preson(){} public Preson(int a){ System.out.println("我是人类的Int型构造方法"); } public void sleep(){ System.out.println("我是人类的睡觉方法"); } public void eat(){ System.out.println("我是人类的吃饭方法"); } } public class Test { public static void main(String[] args) { Preson animal = new Preson(); animal.eat(); animal.sleep(); } }
Object类中的方法
hashCode() 将对象在内存中的地址经过计算得到一个int整数
public native int hashCode();
equals() 用来比较两个对象的内容 Object默认效果是==
==可以比较基本类型(比较值) 可以比较引用类型(比较地址)
equals方法时Object类中继承过来的方法 默认效果比较地址
如果想要改变其规则 可以进行方法重写
public boolean equals(Object obj){
return (this == obj);
}
public String toString(){
return this.getClass().getName()+"@"+Integer.toHexString(this.hashCode());
}
getClass() 获取对象对应类的类映射(反射)
wait() 线程进入挂起等待状态 存在方法重载
notify() 线程唤醒
notifyAll() 唤醒所有
finalize() 权限修饰符是protected 在对象被GC回收的时候 默认调用执行的方法
final finally finalize区别
protected void finalize(){
clone() 权限修饰符是protected 为了克隆对象