“核心技术:继承”的版本间差异
跳到导航
跳到搜索
无编辑摘要 |
|||
第3行: | 第3行: | ||
== 类、超类和子类 == | == 类、超类和子类 == | ||
=== 定义子类 === | |||
关键字 extends 表示正在构造的新类(subclass子类;derived class派生类;child class孩子类)派生于一个已存在的类(superclass超类、base class基类、parent class父类) | |||
=== 覆盖方法 === | |||
父类中的某些方法对子类并不一定适应,需要子类对方法覆盖(override); | |||
* 子类不能之间访问父类的私有域,必须使用父类私有域对应的公有访问接口; | |||
* 子类可以增加域、增加方法、覆盖方法,但不能删除继承的域和方法; | |||
* 覆盖一个方法的时候,子类方法不能低于超类方法的可见性; | |||
“super”关键字用于只是编译器调用父类方法。 | |||
* super与this不同,并非一个对象的引用,不能将super赋给另一个对象变量; | |||
=== 子类构造器 === | |||
子类构造器中: | |||
* 如果使用super显示调用父类构造器,则该语句必须是子类构造器的第一条语句出现; | |||
* 如果没有显示调用父类构造器,则将自动地调用父类默认(没有参数)的构造器; | |||
* 如果没有显示调用父类构造器,且父类没有无参构造器,则Java编译器将报告错误; | |||
=== 多态 === | |||
有一个用来判断是否应该设计为继承关系的规则:“is-a”,即“'''置换法则'''”,'''程序中出现超类对象的任何地方都可以用子类对象置换'''。 | |||
* 一个对象可以指示多种实际类型的现象,被称为'''多态'''(polymorphism);<br/> | |||
*: 如,Employee既可以引用一个Employee对象,也可以引用Employee的子类对象(如,Manager) | |||
* 在运行时能自动地选择调用哪个方法的现象,被称为'''动态绑定'''(dynamic binding);<br/> | |||
* 如果方法是private方法、static方法、final方法,那么编译器可以准确地知道应该调用的方法,这种调用方式被称为'''静态调用'''(static bingding); | |||
=== 阻止继承:final类和方法 === | |||
final使用: | |||
* final域:域不能被修改 | |||
* final方法:方法不能被覆盖 | |||
* final类:类不能被扩展(即不能被继承) | |||
*: 类中的所有方法自动成为final | |||
*: 类中的域并不为final | |||
=== 强制类型转换 === | |||
对象的强制类型转换: | |||
# 只能在继承层次内进行类型转换; | |||
# 在将父类转换为子类之前,应该用'''instanceof'''检查 | |||
#* “instanceof”用于判断对象是否为某个类型 | |||
=== 抽象类 === | |||
* 包含一个或多个抽象方法的类,必须被声明为抽象类; | |||
* 除了抽象方法,抽象类还可以包含具体数据和具体方法; | |||
* 抽象类不能被实例化; | |||
* 可以定义抽象类对象,该对象只能引用非抽象子类的对象; | |||
=== 受保护访问 === | |||
# public:公有,对其他类可见 | |||
# private:私有,对其他类不可见(即使子类也不可见) | |||
# protect:受保护,对所有子类 及同一个包中的其他类可见,包外不可见 | |||
* 对本包可见是默认的,不需要修饰符; | |||
== Object:所有类的超类 == | == Object:所有类的超类 == |
2020年10月16日 (五) 21:59的版本
类、超类和子类
定义子类
关键字 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:受保护,对所有子类 及同一个包中的其他类可见,包外不可见
- 对本包可见是默认的,不需要修饰符;