前言:继承是面向对象的三大特征之一,也是实现软件复用的重要手段,Java继承具有单继承的特点, 每个子类只有一个直接父类。
类的继承
通过扩展一个类来建立另外一个类的过程称为继承(inheritance),利用继承,人们可以基于已存在的类构造一个新类。继承已存在的类就是复用(继承)这些类的方法和域。在此基础上,还可以添加一些新的方法和域, 以满足新的需求。
实现继承的类被称为子类,被继承的类被称为父类,父类和子类的关系, 是一种一般和特殊的关系.
定义子类:
关键字 extends (extends 表示继承),表明正在构造的新类派生于一个已存在的类。
public class Manager extends Employee
{ 添加方法和域 }
子类继承了父类, 将获得父类的全部成员变量和方法.
代码示范子类继承父类:
//父类
public class People {
public String name;
public void info()
{
System.out.println("我的名字是:" + name);
}
}
//子类
public class Student extends People {
public static void main(String[] args) {
People people = new People();
people.name = "张三";
people.info();
}
}
重写父类的方法
子类继承了父类, 所以说子类是一个特殊的父类。 大部分时候,子类总是以父类为基础,额外增加新的成员变量和方法,但有一种情况例外: 子类需要重写父类的方法。
代码示范重写父类的方法:
//父类
public class People {
public String name;
public void info()
{
System.out.println("我的名字是:" + name);
}
}
//子类
public class Student extends People {
public static void main(String[] args) {
Student student = new Student();
student.name = "张三";
student.info();
}
}
public void info(){
System.out.println(name + "是我的名字");
}
这种子类包含与父类同名方法的现象称为方法重写(Override). 也被称为方法覆盖. 可以说子类重写了父类的方法, 也可以说子类覆盖了父类的方法, 都行,要遵循两同两小一大规则.
两同: 方法名相同 / 形参列表相同
两小: 子类方法返回值类型应比父类方法返回值类型小或相等. / 子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等.
一大: 子类方法的访问权限应比父类方法的访问权限大或相等.
附:继承的使用技巧:
- 将公共操作和域放在超类
- 不要使用受保护的域
- 使用继承实现“ is-a” 关系。(is-a规则:用来判断是否应该设计为继承关系的简单规则, 它表明子类的每个对象也是超类的对象。 )
- 除非所有继承的方法都有意义, 否则不要使用继承
- 在覆盖方法时, 不要改变预期的行为
- 使用多态, 而非类型信息
- 不要过多地使用反射
方法的重载和重写
方法重载和方法重写在英文中分别是 overload 和 override
重载和重写并不是同一种东西, 虽然二者都是发生在方法之间, 并要求方法名相同之外, 并没有太大相似之处.
- 因为重载主要发生在同一个类的多个同名方法之间.
- 而重写发生在子类和父类的同名方法之间.
当然, 父类方法和子类方法之间也有可能发生重载, 因为子类会获得父类方法. 如果子类定义了一个与父类方法有相同方法名, 但参数列表不同的方法, 就会形成父类方法和子类方法的重载.