Java核心技术卷I第五章学习笔记(继承is-a)

继承已存在的类就 是复用(继承)这些类的方法和域(字段)。在此基础上,还可以添加一些新的方法和域, 以满足新 的需求。这是 Java 程序设计中的一项核心技术。Java 不支持多继承。

1.类、超类和子类

1.1定义子类

在一所公司中,有经理和普通员工,普通员工完成工作领工资,但是经理完成工作除了领工资还领奖金,但是经理一定是员工,员工不一定是经理,所以员工可以定义为超类,经理为子类,经理继承(extends)员工类,并拓展加上奖金方法。关键字 extends 表明正在构造的新类派生于一个已存在的类。超类不可以调用子类新加的方法和域(字段),但是子类可以调用父类所有的方法与字段,但是final修饰的类不能被继承。

1.2覆盖方法(通过@Override来对超类方法的重写覆盖)

员工的正常工资通过getSalaly()方法获取,但是对与经理来说工资是正常工资加上奖金,所以经理类中要对继承的getSalaly()方法进行重写在原有工资加上奖金,通过super.getSalaly()调用超类的getSalaly()方法加奖金

注释: 有些人认为 super 与 this 引用(this是引用类的对象)是类似的概念, 实际上,这样比较并不太恰当。这是 因为 super 不是一个对象的引用, 不能将 super 赋给另一个对象变量, super它只是一个指示编 译器调用超类方法的特殊关键字。

在子类中可以增加域、 增加方法或覆盖超类的方法,然而绝对不能删除继承的任何域和方法。

1.3子类构造器

public Manager(String name, double salary, int year, int month, int day) {
    super(name, salary, year, month, day); 
    bonus = 0; 
}

这里的关键字 super 具有不同的含义。语句 super(n, s, year, month, day); 是“ 调用超类中含有 name、salaly、year、month 和 day 参数的构造器” 的简写形式。 由于子类的构造器不能访问超类的私有域, 所以必须利用超类的构造器对这部分私有域进行初始化,我们可以通过 super 实现对超类构造器的调用。使用 super 调用构造器的语句必须是子类构造器的第一条语句。 如果子类的构造器没有显式地调用超类的构造器, 则将自动地调用超类默认(没有参数 ) 的构造器。 如果超类没有不带参数的构造器, 并且在子类的构造器中又没有显式地调用超类 的其他构造器’ 则 Java 编译器将报告错误。

注释:关键字 this 有两个用途: 一是引用隐式参数,二是调用该类其他的构造器 , 同样,super 关键字也有两个用途:一是调用超类的方法,二是调用超类的构造器。 在调用构造器的时候,这两个关键字的使用方式很相似。构造参数既可以传递给本类( this) 的其他构造器,也可 以传递给超类(super ) 的构造器(作为构造器中的第一条语句出现)。

1.4多态

一个对象变量可以指示多种实际类型的现象被称为多态( polymorphism)。 在运行时能够自动地选择调用哪个方法的现象称为动态绑定( dynamic binding。)。子类的每个对象也是超类的对象.

超类的变量可以引用超类对象和子类对象,但是不能将一个超类的引用赋给子类变量。

1.5 方法调用过程

ObjectClass.Method(args):ObjectClass是类的对象也是方法的隐式参数。

1:编译器首先查找并列举ObjectClass类和其超类中的所有方法名为Method的方法(public修饰);

2:査看调用方法时提供的参数类型。如果在所有名为Method()的方法中存在 一个与提供的参数类型完全匹配,就选择这个方法。这个过程被称为重载解析( overloading resolution)

注释: 前面曾经说过, 方法的名字和参数列表称为方法的签名。例如, f(int) 和 f(String) 是两个具有相同名字, 不同签名的方法。如果在子类中定义了一个与超类签名相同的方法, 那么子类中的这个方法就覆盖了超类中的这个相同签名的方法。 不过,返回类型不是签名的一部分, 因此,在覆盖方法时, 一定要保证返回类型 的兼容性。 允许子类将覆盖方法的返回类型定义为原返回类型的子类型(子类)。

上一篇:BLOG-2


下一篇:Java基础重点知识点《异常05》