情景:
假设张老师是一家培训机构的英语老师,她的学生有大学生、中学生和小学生。张老师很认真地为学生们建好了类,并且保存了姓名、年龄、住址、英语水平等不同属性和学习方法和测试方法等不同方法。而2020年北京冬奥会的申办使得人们对学英语的热情大增,张老师的学生种类增加了销售人员、设计师、工程师、运动员等等……一百多个种类!显然,为这一百多种学生建类不仅会使姓名年龄等代码显得重复冗余,张老师本身也需要对教学方法进行多次重载。怎么办才好呢?
这时候就需要用到类的继承了。类的继承就是把多个有共同点的事物中的共同点抽象出来,写成一个父类,把这些事物抽象成类去继承父类中的那些共同点。
对张老师而来,这一百多种类都是学生,她的工作就是为他们提高英语水平。我们可以把多种学生的共同点抽象出来,形成一个学生类,然后让不同的类去继承这个学生类,可以大大减少代码量,也可以通过处理父类类型,对所有子类类型进行处理。
使用类的继承的好处:
1.提高代码重用性
将子类中的共同属性、方法放入父类中。
2.提高程序的扩展性
可通过处理父类类型,对所有子类类型进行处理,可无限扩展子类
3.提高了代码的可维护性
修改时只需要修改少量代码即可。
子类可以继承到父类所有的属性和所有的普通方法,但是不包含构造方法。子类也可以继承父类没有的属性和方法。
图1 类的继承权限
类的继承:
关键字:extends (Java中类只能继承一个父类)
格式:
public class 类名(子类、派生类、超类) extends 类名(父类、基类) {
}
类的继承代码实现:
Student {String name; study(){} }
UNStudent extends Student { study(){} }
GStudent extends Student { study(){} }
CStudent extends Student { }
XStudent extends Student { }
由代码可知,各种学生类继承了Student这个类,也继承了Student父类的name属性和study()方法。其中,部分子类还对父类中的study()方法进行了重写。
方法重写:
方法重写必须满足的条件:
1.必须要存在继承关系;
2.子类在重写父类方法时,子类方法的访问修饰符可以大于或等于父类方法的访问修饰符;
3.子类在重写父类方法时,子类方法的返回值数据类型,方法名,参数都必须要和父类的完全一致;
4.子类方法中的具体实现要和父类不同。
图2 eclipse重写标志(绿色小三角)
既然重写后的子类方法与父类方法一致,那我们怎么知道我们调用的是哪一个方法呢?
根据new关键字后的类名来决定,如果类名是子类的,则优先调用子类的方法,如果子类没有才调用父类中的方法。
图3 方法重写后的调用
如果方法重写后调用子类的方法还需调用父类的方法,用super关键字。如果说this关键字相当于生活中的"我",则super关键字相当于"我父亲"~~~
图4 加super关键字之后
自动型转
父类的类型名可以引用一个子类的对象,用的就是自动型转。
自动转型的格式:
父类名 对象名 = new 子类名();
最常见的自动转型:
定义方法时的参数为父类对象,而实际调用方法时传参却是子类参数。
public void 方法名(父类名 对象名){}
方法名(子类对象);
如上文提到的张老师的教学方法:
Teacher {
String name;
teach(Student un){un.study(); }
}
(不同于强制类型转换。构造了一个子类类型的对象,用一个父类类型的变量引用了,那么,需要将这个对象的类型还原的时候,就可以用 子类名 子类对象=(子类)父类对象;)
QQ:375471598
微信:Q159837547
欢迎过来勾搭小邱同学,或者对文章提出修改意见,共同成长。