文章目录
子类与父类
Java不支持多重继承,即子类只能有一个父类
子类
class 子类名 extends 父类名
类的树形结构
在这个树形结构中,根节点为Object类,任何类都是Object类的子孙类
子类的继承性
子类与父类在同一包中正常继承,子类继承父类不是private的类型
子类与父类不在同一包内的时候,最大的区别就在于友好访问权限的成员变量,子类只能继承protected和public类的成员变量与方法
protected细讲
- 对于子类D自己声明的protected成员变量和方法,只要object类和D类在同一个包内,object类就可以访问protected
- 对于子类D从父亲继承的protected,需要追溯它的祖先,只要它的祖先与object在一个包内就可以访问
成员变量的隐藏与方法重写
子类所声明的成员变量的名字与父类继承来的成员变量的名字相同,就会隐藏父类的成员变量
子类继承的方法所操作的成员变量一定是被子类继承或隐藏的的成员变量
子类自己声明的方法无法使用被隐藏的变量
方法重写
子类通过重写可以隐藏已经继承的方法
- 语法规则
方法的类型和父亲的的方法类型一致或者是父亲方法类型的子类型
子类方法的名字、参数个数、参数的类型和父亲的方法完全相同只是内容算法不同 - 重写的目的
子类通过方法的重写把父类的行为变成自己的行为
如果重写了之后,子类调用的方法一定是重写的方法 - 重写的注意事项
重写父类的方法时,不允许降低方法的访问权限,但可以提高访问权限
(权限高低 public protect 友好的 private)
super关键字
用super操作被隐藏的成员变量与方法
如果子类想要使用被隐藏的成员变量或方法,就需要使用关键字super
用super调用父类的构造方法
当用子类的构造方法创建一个子类的对象时,子类的构造方法总是先调用父类的某个构造方法
如果子类的构造方法没有明显地指明使用父类的哪个构造方法,子类调用父类的不带参数的构造方法
由于子类不继承父类的构造方法,因此,子类在其构造方法中需要使用super来调用父类的构造方法,而且super必须是子类构造方法中的头一条语句
final关键字
final可以修饰类、成员变量和方法中的局部变量
final类
final类不可以被继承
String类就是一个final类
final方法
不允许子类重写
常量
如果成员变量或局部变量被修饰为final,那它就是常量,常量必须有初值
子类与对象
对象的上转型对象
父类是子类的上转型对象
对象的上转型对象的实体是子类负责创建的
注意:父亲创建的对象与子类对象的上转型对象并不相同
可以将对象的上转型对象再强制转换成一个子类对象,这时,该子类对象又具有了子类的所有的树形和功能//会不会遗失一些功能 不会
不可以将父类创建的对象的引用赋值给子类声明的对象
如果子类重写了父类的静态方法,那么子类对象的上转型对象不能调用子类重写的静态方法,只能调用父类的静态方法
abstract类与abstract方法
用关键词abstract修饰的类称为abstract类(抽象类)
用关键词abstract修饰的方法称为abstract方法(抽象方法)
对于abstract方法,只允许声明,不允许实现,而且不允许同时用final与abstract同时修饰一个方法或类,也不允许用static修饰abstract方法,即abstract方法只能是实例方法
- abstract 类中可以abstract方法
非abstract类中不可以用abstract方法 - abstract类不允许用new创建对象
如果一个非抽象类是某个抽象类的子类,那么它必须重写父类的抽象方法,给出方法体 - abstract类的对象作上转型对象
调用子类重写的方法
面向抽象编程
目的:应对用户需求的变化,将某个类中经常因需求变化而需要变动的代码从该类中分离出去
核心:让类中每种可能的变化对应地交给抽象类的一个子类去负责,从而让该类的设计者不关心具体的实现。
开-闭原则
让设计的系统对扩展开放,对修改关闭