类和类之间的关系
- a is-a b 泛化(继承 实现)
- a has-a b 包含(组合 聚合 关联)
- a use-a b 依赖 (need-a)
4种权限修饰符:public protected 默认不写 private (它们的权限由大到小)
继承关系
- 子类继承父类用关键字 extends
- 子类的对象可以调用父类中的(public protected)属性和方法,当做自己的来使用
2.1 构造方法严格意义上说 不算做子类继承过来
只是单纯的在子类调动构造 方法时默认调用父类的构造方法
2.2程序块严格意义上说 不算做子类继承过来
程序块子类不能直接调用 子类执行构造方法之前 默认调用了父类的构造方法 父类构造方法执行之前自动执行父类的程序块 - 子类可以添加自己独有的属性或方法
- 可能子类从父类继承过来的方法不能满足子类需要,可以在子类中重写父类的方法
- 每一个类都有继承类,如果不写extends关键字,则默认继承Object类
所以Object类非常重要!可以理解为它是任何一个引用类型的父类(直接或间接继承Object) Object类没有父类 - java中继承是单个存在的(单继承,多实现)每一个类只能有一个继承类(在extends关键字后面只能写一个类) c++是有多继承的
java语言采用单继承是为了让类变得更加安全,简单。 但是java可以通过传递的方式实现多继承的效果 - 继承在内存中的存储形式
- 关于this和super的使用 this和super都是指代词 代替的是对象
this(代替的是当前调用方法或属性时的那个对象 不一定是当前类的对象)
super(代替的是当前执行方法时的对象的父类对象)
它们都能调用一般属性和一般方法 可以放在类成员的任意位置(属性 方法 构造 块)
注意调用一般方法的时候可以来回调用(写法可以 编译好用,执行可能会产生问题StackOverflowError)
可以调用构造方法(放在构造方法的第一行)
调用构造方法的时候不能来回调用(编译就不好用)
this和super在构造方法中调用另一个类的构造方法时不能同时出现在第一行
Object类中的方法:
- *hashCode() 将对象在内存中的地址经过计算得到一个int整数
public native int hashCode();
- *equals() 用来比较两个对象的内容 Object默认效果是==
public boolean equals(Object obj){
return (this==obj);
}
总结:==可以比较基本类型(比较的是值),也可以比较引用类型(比较的是地址)
equals()方法是Object类中继承过来的方法,默认比较的是地址,如果想要改变其规则,可以进行方法重写
- *toString() 打印输出时将对象变成String字符串
public String toString(){
return getClass().getName()+"@"+Integer.toHexString(hashCode());
}
- getClass() 获取对象对应类的类映射(反射机制)
- wait() 线程进入挂起等待状态 它存在方法重载
- notify() 线程唤醒
- notifyAll() 唤醒所有
- finalize() 权限修饰符是protected 在对象被GC回收的时候 默认调用执行的方法 相当于析构函数
构造函数:创建对象
析构函数:回收对象
笔试题经常考:final finally finalize的区别 它们名字上看起来类似 实际上没有任何关联
protected void finalize(){
}
- clone() 权限修饰符是protected 为了克隆对象
这9个方法要求:记忆 方法名 方法参数 方法返回值 方法是否存在重载 常用的几个方法需要知道它的源代码如何实现
如果方法的特征符包含native而且又没有方法体:注意它不是抽象方法,它是做事情的。在java当中看不到底层源码了。
它调用了c++语言给我们写的核心的机制。
所以以后见到native:对不起,java语言到头了,native是调用了c++语言写的程序。
方法重写和方法重载的区别:
\ | 方法重写override | 方法重载overload |
类 | 产生两个继承关系的类 | 一个类中的一组方法 |
子类重写父类的方法 | ||
权限 | 子类可以大于等于父类 | 没有要求 |
特征 | final static abstract | 没有要求 |
父类方法是final 子类不能重写 | ||
父类方法是static 子类不存在重写 | ||
父类方法是abstract 子类必须重写 (否则子类就是抽象类) | ||
返回值 | 子类可以小于等于父类 | 没有要求 |
方法名字 | 子类与父类一致 | 一个类中的好多方法名必须一致 |
参数列表 | 子类与父类一致 | 每一个方法的参数必须不一致(个数 类型 顺序) |
异常 | 运行时? 编译时? | 没有要求 |
如果父类方法抛出运行时异常 | ||
子类可以不予理会 | ||
如果父类方法抛出编译时异常 | ||
子类抛出异常的个数以及类型都小于等于父类 | ||
方法体 | 子类的方法内容与父类不一致 | 每一个重载的方法 执行过程不一致 |
a has-a b 包含(组合 聚合 关联)
这三个关系从亲密程度来讲不太一样 关系越来越松弛
组合---->人和大脑 人和心脏的关系(整体和部分的关系 不可分割 整体要出现都出现 要消亡都消亡 )
聚合---->汽车和车轮子 电脑和主板(整体和部分的关系 创建时有可能是分开的 所以聚合没有组合关系紧密)
关联---->人有汽车 人有电脑(整体和部分的关系 可以分割 后来形成在一起的)
从java程序来描述这样的关系: 通过一个类的对象当做另一个类的属性来存储
a use-a b 依赖 (need-a)(最常见)
不是整体和部分的关系 某一件事情产生了关系 临时组合在一起 这件事情一旦做完关系即解散
屠夫杀猪 一个类(屠夫) 可以做一件事:杀猪 需要条件:一头猪(只是做杀猪这件事的时候需要猪,做其他事情不需要 强调临时性)
从java程序来描述这样的关系: 一个类的方法中使用到了另一个类的对象
设计类的关系遵循的原则:高内聚低耦合
耦合度:泛化>包含>依赖