1.泛化(继承,实现)
A is a B
A有B的所有属性
2.包含(组合,聚合,关联)
A has a B
B是A的一部分
3.依赖
A use a B
A需要B才能实现
继承:
所有类都默认继承object类
object中的方法:
hashcode() 将内存地址计算得到一个整数, public native int hashcode(); native: 调用了底层c++语言的方法
equals() 比较内容是否一致 publice boolean equals(object obj){ return this == obj;}
toString() 把类的内容转化为String字符串
getClass() 获取类的映射
wait 线程等待
notify 线程唤醒
notifyAll 全部唤醒
finalize protected 类被垃圾回收器回收时调用
clone protected 克隆类对象
子类可以继承父类的所有属性和方法,父类中的所有public属性和方法都可以直接使用,private的可以继承但是不能修改和直接使用。
子类用 extends + 父类 继承
每一个类只能继承一个类,让类变的更加安全。
子类可以添加自己独特的属性和方法
权限:public,protected,默认不写,private 从大到小
子类的权限必须大于等于父类
方法返回值:子类范围必须小于等于父类(子类返回值是person,父类返回值是animal)
方法重写: 子类重写父类方法。名字参数一致
方法重载:一个类中的相同名字的方法。 名字一致,参数必须不同
特征标志符:父类中 final static abstract 修饰的方法
final:子类不能重写
static:子类不存在
abstract: 子类必须重写
构造方法:创建子类时会调用子类构造方法,也会调用父类的构造方法
普通方法:子类调用方法时,优先寻找子类符合要求的方法,没有则寻找父类,再没有就寻找父类的父类。
this.方法 () this指的是当前对象的方法,而不是this定义时的所在类。
super.方法() super指的是当前执行的对象的父类。
this和super在构造方法中不能互相调用对方的构造方法。(this和super调用构造方法为this(),super(),且必须写在第一行)
package Extends; public class People extends Animal{ //构造方法 public People(){ System.out.println("People的构造方法"); } public void test(){ System.out.println("People的test"); } public void show(){ System.out.println("age = " + this.age);//this.name在子类中找不到因为是private,在父类中可以this.name使用。 } public static void main(String[] args) { People p = new People(); //会运行Object,Animal People 3个类的构造方法 p.test(); //会优先运行p这个对象(是一个people)的方法,如果没有,则去父类寻找 p.age = 11; } }
package Extends; public class Animal { private String name; public int age; public Animal(){ System.out.println("Animal的构造方法"); } public void test(){ System.out.println("Animal的test"); } }
2.包含(组合,聚合,关联)
一个类中包含另一个类,那个类是这个类的一部分
组合:一起出现,一起消亡。
聚合:整体和部分的关系,创建时有可能分开。
关联:整体和部分,可以分割,后来形成。
高内聚:类内的属性方法只和自己关系密切
低耦合:类和其他类互相影响小
3.依赖
一个类的方法中使用到了另一个类。
可以使传参或者创建等操作。
类的加载顺序:
Animal
Person extends Animal
Person p = new Person();
先加载静态
先执行块
先执行构造方法
先父类
1. 加载父类静态部分,执行静态块
加载静态部分(方法区的静态元素区):空间,属性,方法,块
执行静态块
2. 加载子类静态部分,执行静态块
加载静态部分(方法区的静态元素区):空间,属性,方法,块
执行静态块
3. 开辟对象空间(堆内存)
4. 加载父类非静态部分:属性,方法,块,构造方法
5. 执行父类块
6. 执行父类构造方法
7. 加载子类非静态部分:属性,方法,块,构造方法
8. 执行子类块
9. 执行子类构造方法
10.空间地址赋给变量p
附加:
main会先加载自己所在的class的静态属性和块。
静态部分加载时用到的非静态部分也会提前被加载,有可能比静态部分加载的早。