JavaSE Day10 继承 final
目录
继承
定义
根据已有的类 派生出新类的技术;
作用:
- 代码重用
- 方便维护
- 高耦合===类之间的紧密连接程度;
package day10;
//父类,超类,基类
public class Teacher {
private String name;
public Teacher(){
this.name = name;
System.out.println("父类构造");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
Teacher(String name){
this.name = name;
}
public void getLesson() {
System.out.println("将数学课");
}
}
class SqlTeacher {
public void dance(){
System.out.println("跳舞");
}
}
class JavaTeacher extends Teacher {
//String name;// 覆盖了父类的属性;
String tattoo;
JavaTeacher(){
System.out.println("子类构造");
}
public void sing(){
System.out.println(getName()+"唱歌");
}
public void display(){
super.getLesson();
}
public void getLesson() {
System.out.println(getName()+"将java课");
}
}
java只支持单继承,不允许多继承;
也就是只有一个父类
子类:
- 子类可以继承父类的成员(属性和方法)
- 也可以有自己的独特的成员;
注意
- 有些成员不能继承;
- 私有的不能被继承;(不能调用父类属性;)
- 不同程序包下,使用默认访问权限的成员,不能被继承;
- 构造器不能继承;(先调用父类构造,在调用子类构造,加载类加载父类,在加载子类;)
- 能被继承的成员,才能被直接访问,否则子类没有权限这个属性;只能通过父类提供的公共方法来访问;
继承设计原则
里氏替换原则 LSP:在一个软件系统中,子类对象可以替换所有使用的父类对象,且程序行为没有变化
方法重写
定义
- 子类重写(覆盖)了父类的方法;
- 在子类中,必须是实例方法,方法名相同,参数列表相同,返回值类型相同。
package day10;
import java.util.List;
class Base{
public Base f(List<String> a){
return new Base();
}
}
class Sub extends Base{
// 注解,注解可以让编译器自动检查代码是否符合规范
@Override
public Base f(List a){
// Base base = new Base();
return new Sub();
}
}
public class TestBase {
public static void main(String[] args) {
}
}
注意
-
参数列表
父类参数擦除后与子类相同(泛型) -
返回值类型
引用类型,子类的返回值类型范围比父类要小,也就是说子类的返回值类型可以是父类返回值的子类型。 -
访问修饰符
不能比父类更严格 -
异常处理
不能比父类范围更大
为什么要重写
- 子类修改了父类的功能
- 子类扩充了父类的功能
查看对象的类型
对象.getClass().getName()
super
表示父类范围
作用
- 调用父类成员
- 区分同名的子类和父类的成员
- 调用父类构造
调用构造
- 创建子类对象时,一定要先调用父类构造(一直到object类的构造);然后在调用子类构造
- 子类构造器中,如果没有显示调用父类构造super()或者构造this(),那么编译器一定会分配一个super();
- 父类中显示定义了构造器,而且只有带参数构造,那么子类构造器中,必须显示super(参数)调用父类带参构造;
继承传递性
- 子类可以继承直接父类 和间接父类中的成员
- super只能调用直接父类的成员;间接父类需要在直接父类中使用super来调用;
object类
所有类的直接或间接父类,在java.lang包中
finalize()
- 垃圾回收器释放对象之前调用
- 用于释放资源或者给对象恢复引用
equals()
- 比较两个对象是否相等,地址是否相等
- 对称性
如果x.equals(y)返回是"true",那么y.equals(x)也应该返回是"true" - 反射性
x.equals(x)必须返回是"true"。 - 类推性
如果x.equals(y)返回是"true",而且y.equals(z)返回是"true",那么z.equals(x)也应该返回是"true"。 - 一致性
如果x.equals(y)返回是"true",只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是"true"。 - 非空性
x.equals(null),永远返回是"false";x.equals(和x不同类型的对象)永远返回是"false"。
toString()
对象的字符串描述信息,在调用print()和println();输出对象名时,会自动隐式调用toString()。
- getClass
获取类在加载时,在堆内存中的对象模板的地址 - getName
获取堆内存中对象模板的地址的名字
哈希
是对数据唯一的标识
哈希值
把一些数据 使用哈希算法 变换成固定的数值,这个数值就是哈希值
哈希算法:
- 可以做为文件或数据的唯一标识
- 节省系统的开销;
- 加密;
算法:
-
直接寻址法
直接从所有数据中取出同一个属性当做哈希值; -
数字分析法
从所有数据中的一个属性中,找不同的地方,作为哈希值; -
平方取中法
取出数据中平方后,中间的数字 -
折叠法
-
随机数法
-
除留余数法
final
表示终态
修饰
类
- 此类不能被继承
例如 String System - 设计
- 为了类的安全性
- 继承是破坏封装的
- 类中的方法有复杂的调用关系
- 是最终版本的类
方法
- 此方法不能被重写
- 所有子类使用同一版本的方法
变量
- 此变量就是常量
- 只能赋值一次
- 不能修改常量的值
但是如果常量的值是引用类型,是可以修改属性的值 - 命名规范
- 所有字母都大写
- 多个单词组成由下划线链接
- 作用
- 数值安全
- 可维护
- 可读性
设计一个可以被继承的类
- 继承的层次关系最好不要超过3层
- 最好有详细的文档说明,方法的自用性是什么,重写后会带来什么影响
- 要封装
- 访问的权限
- 如果对所有用户开放就用public
- 对子类开放用protected
- 对子类开放,有不希望子类更改代码,定义final
什么样需要扩展子类
- 增加了独特的属性
- 增加了独特的功能
继承的优缺点
优点
- 代码重用
- 高耦合
缺点
- 破坏了封装
- 高耦合


浙公网安备 33010602011771号