“核心技术:继承”的版本间差异
跳到导航
跳到搜索
第58行: | 第58行: | ||
== Object:所有类的超类 == | == Object:所有类的超类 == | ||
Object 类Java中所有类的始祖,每个类都由它扩展而来 | |||
* 只有基本类型不是对象 | |||
* 所有的数组类型(无论基本类型数组,对象数组),都扩展了Object类 | |||
=== equals === | |||
用于判断一个对象是否等于另一个对象。(需要重写) | |||
* 在Object中,equals将判断两个对象的是否有相同的引用(与“==”一样); | |||
* 为了判断值相等,应该重写equals方法,进行内容判断(先比较hashcode,再比较值); | |||
==== 相等测试与继承 ==== | |||
Java语言规范要求equals方法具有以下特性: | |||
# 自反性:对于任何非空引用x,均有x.equals(x)=true; | |||
# 对称性:对于任何引用x、y,当且仅当x.equals(y)=true,则应y.equals(x)=true; | |||
# 传递性:对于任何引用x、y、z,如果x.equals(y)=true且y.equals(z)=true,则有x.equals(z)=true; | |||
# 一致性:如果x、y引用的对象没有变化,反复调用x.equals(y)应返回同样结果; | |||
# 对于任何非空引用x,均有x.equals(null)=false; | |||
=== hashcode === | |||
散列码(hashcode)是由对象导出的一个整型值,是没有规律的: | |||
# 两个不同对象的hashcode基本不会相同; | |||
# 两个对象相同,其hashcode必定相同(所以在equals前先比较hashcode可以提高效率); | |||
* “hashcode()”应该返回一个整型数值(可以负数),并合理地组合实例域的散列码,以便能让各个不同的对象产生的散列码更加均匀; | |||
* 最好使“hashcode()”对null安全:如果参数为null,这个方法返回0,否则返回对参数调用hashcode的结果; | |||
=== toString === | |||
该方法用于返回表示对象值的字符串。(需要重写) | |||
== 泛型数组列表 == | == 泛型数组列表 == |
2020年10月16日 (五) 22:25的版本
类、超类和子类
定义子类
关键字 extends 表示正在构造的新类(subclass子类;derived class派生类;child class孩子类)派生于一个已存在的类(superclass超类、base class基类、parent class父类)
覆盖方法
父类中的某些方法对子类并不一定适应,需要子类对方法覆盖(override);
- 子类不能之间访问父类的私有域,必须使用父类私有域对应的公有访问接口;
- 子类可以增加域、增加方法、覆盖方法,但不能删除继承的域和方法;
- 覆盖一个方法的时候,子类方法不能低于超类方法的可见性;
“super”关键字用于只是编译器调用父类方法。
- super与this不同,并非一个对象的引用,不能将super赋给另一个对象变量;
子类构造器
子类构造器中:
- 如果使用super显示调用父类构造器,则该语句必须是子类构造器的第一条语句出现;
- 如果没有显示调用父类构造器,则将自动地调用父类默认(没有参数)的构造器;
- 如果没有显示调用父类构造器,且父类没有无参构造器,则Java编译器将报告错误;
多态
有一个用来判断是否应该设计为继承关系的规则:“is-a”,即“置换法则”,程序中出现超类对象的任何地方都可以用子类对象置换。
- 一个对象可以指示多种实际类型的现象,被称为多态(polymorphism);
- 如,Employee既可以引用一个Employee对象,也可以引用Employee的子类对象(如,Manager)
- 在运行时能自动地选择调用哪个方法的现象,被称为动态绑定(dynamic binding);
- 如果方法是private方法、static方法、final方法,那么编译器可以准确地知道应该调用的方法,这种调用方式被称为静态调用(static bingding);
阻止继承:final类和方法
final使用:
- final域:域不能被修改
- final方法:方法不能被覆盖
- final类:类不能被扩展(即不能被继承)
- 类中的所有方法自动成为final
- 类中的域并不为final
强制类型转换
对象的强制类型转换:
- 只能在继承层次内进行类型转换;
- 在将父类转换为子类之前,应该用instanceof检查
- “instanceof”用于判断对象是否为某个类型
抽象类
- 包含一个或多个抽象方法的类,必须被声明为抽象类;
- 除了抽象方法,抽象类还可以包含具体数据和具体方法;
- 抽象类不能被实例化;
- 可以定义抽象类对象,该对象只能引用非抽象子类的对象;
受保护访问
- public:公有,对其他类可见
- private:私有,对其他类不可见(即使子类也不可见)
- protect:受保护,对所有子类 及同一个包中的其他类可见,包外不可见
- 对本包可见是默认的,不需要修饰符;
Object:所有类的超类
Object 类Java中所有类的始祖,每个类都由它扩展而来
- 只有基本类型不是对象
- 所有的数组类型(无论基本类型数组,对象数组),都扩展了Object类
equals
用于判断一个对象是否等于另一个对象。(需要重写)
- 在Object中,equals将判断两个对象的是否有相同的引用(与“==”一样);
- 为了判断值相等,应该重写equals方法,进行内容判断(先比较hashcode,再比较值);
相等测试与继承
Java语言规范要求equals方法具有以下特性:
- 自反性:对于任何非空引用x,均有x.equals(x)=true;
- 对称性:对于任何引用x、y,当且仅当x.equals(y)=true,则应y.equals(x)=true;
- 传递性:对于任何引用x、y、z,如果x.equals(y)=true且y.equals(z)=true,则有x.equals(z)=true;
- 一致性:如果x、y引用的对象没有变化,反复调用x.equals(y)应返回同样结果;
- 对于任何非空引用x,均有x.equals(null)=false;
hashcode
散列码(hashcode)是由对象导出的一个整型值,是没有规律的:
- 两个不同对象的hashcode基本不会相同;
- 两个对象相同,其hashcode必定相同(所以在equals前先比较hashcode可以提高效率);
- “hashcode()”应该返回一个整型数值(可以负数),并合理地组合实例域的散列码,以便能让各个不同的对象产生的散列码更加均匀;
- 最好使“hashcode()”对null安全:如果参数为null,这个方法返回0,否则返回对参数调用hashcode的结果;
toString
该方法用于返回表示对象值的字符串。(需要重写)