1. 继承的基本介绍
现实世界中有这样一种情况,因为有基因的存在,所以无论是人类还是其他生物,后代总会或多或少的拥有其父辈的一些特征。那么在程序中,对象之间可能或多或少地存在一些关系,可能存在相似的类等等。将其移植到Java中,就是继承的概念。
继承是面向对象三大特征之一,其基本作用是代码复用。但是继承最重要的作用是:有了继承才有了方法的覆盖和多态机制。继承需要采用extends关键字,语法格式如下:
1 2 3
| [修饰符列表] class 类名 extends 父类名{ 类体; }
|
Java语言中的继承只支持单继承,即一个类不能同时继承多个类,只能继承一个类。一些基本属于如下(B类继承A类):
- A类称为:父类、基类、超类、superclass;
- B类称为:子类、派生类、subclass。
- 在Java语言当中,子类继承父类都继承哪些数据呢?
- 私有的不支持继承;
- 构造方法不支持继承;
- 其他数据都可以被继承。
- 注意,如果一个类没有显式的继承任何类,该类默认继承JavaSE库当中提供的
java.lang.Object类。Java语言中任何一个类中都有Object类的特征。
2. 方法覆盖
引入了继承,子类和父类之间的方法和属性就有了新的关系。一个典型的概念就是方法覆盖,之前提到方法重载的概念,再来回顾一下。
2.1 方法重载
方法重载又称为Overload
方法重载什么时候使用?
当在同一个类当中,方法完成的功能是相似的,建议方法名相同,方便程序员的编程。
什么条件满足之后构成方法重载?
- 在同一个类当中
- 方法名相同
- 参数列表不同:类型不同,顺序不同,个数不同
方法重载和什么无关?
2.2 方法覆盖
子类继承父类,除了上述不能继承的属性和方法外,其余的属性和方法都会被继承。那么如果父类的方法不能满足当前要求,此时可以修改重新编写该方法,即覆盖。
方法覆盖又被称为方法重写,Override/Overwrite。
什么时候使用方法重写?
当父类中的方法已经无法满足当前子类的业务需求,子类有必要将父类中继承过来的方法进行重新编写,这个重新编写的过程称为方法重写/方法覆盖。
什么条件满足之后方法会发生重写呢?(代码满足什么条件之后,就构成方法的覆盖呢?)
- 方法重写发生在具有继承关系的父子类之间
- 方法名相同,返回值类型相同,形式参数列表相同
- 访问权限不能更低,可以更高。(即父类中的方法如果是public,则子类重写之后的不能比public权限低。)
- 抛出异常不能更多,可以更少。
建议方法重写的时候建议复制粘贴,不要编写,容易出错,可能导致没有产生覆盖。
注意:
- 私有方法不能继承,所以不能覆盖。
- 构造方法不能继承,所以不能覆盖。
- 静态方法不存在覆盖。
- 覆盖只针对方法,不针对属性。
3. 简单案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
| class Animal{ float height; float weight;
Animal(){ this(30.0f, 5.0f); }
Animal(float height, float weight){ this.height = height; this.weight = weight; }
public void eating(){ System.out.println("在吃饭..."); }
public void sleeping(){ System.out.println("在睡觉..."); }
public void alive(){ System.out.println("目前在活着..."); } }
class Dog extends Animal{ String name;
Dog(){ this("小黑", 35.0f, 5.0f); }
Dog(String name, float height, float weight){ this.name = name; this.height = height; this.weight = weight; }
public void eating(){ System.out.println(this.name + "[dog]" + "在吃饭..."); }
public void sleeping(){ System.out.println(this.name + "[dog]" + "在睡觉..."); }
@Override public String toString() { return "Dog{" + "name=" + name + ", height=" + height + "cm" + ", weight='" + weight + "kg" + '\'' + '}'; } }
public class TestOOP_02 {
public static void main(String[] args) { Animal aml = new Animal(); aml.eating(); aml.sleeping(); aml.alive(); System.out.println(aml); System.out.println("----------");
Dog dg = new Dog(); dg.eating(); dg.sleeping(); dg.alive(); System.out.println(dg); } }
|
4. 备注
参考B站《动力节点》。