• Java#18(面向对象三大特征之一:继承)


     

    目录

    一.继承

    1.Java中提供了关键字extends,可以让一个类和另一个类建立起继承关系

    2.继承的好处

    3.什么时候使用继承?

     二.继承的特点

    java只支持单继承,不支持多继承,但支持多层继承

     三.子类到底能继承父类中的哪些内容?

    四.继承中成员变量和成员方法的访问特点

    1. 继承中成员变量访问特点: 就近原则

    2.如果出现了重名的成员变量怎么办?

    3.构造方法的访问特点

    五.方法重写注意事项和要求


    一.继承

    1.Java中提供了关键字extends,可以让一个类和另一个类建立起继承关系

    格式: public class 子类名 extends 父类名  { }

    子类也可以称为派生类 , 父类也可以称为基类超类

    2.继承的好处

    (1)可以把多个子类中重复的代码抽取到父类中,从而提高代码的复用性

    (2)子类可以在父类的基础上,增加其他功能,使子类更加强大

    3.什么时候使用继承?

    当类与类之间,存在相同的内容时,并满足子类是父类中的一种,就可以考虑使用继承,阿里优化代码

    子类是父类中的一种:例如:父类是Person,子类一个是Student,一个是Phone

                               这就不能使用继承,因为父类代表人,而Phone是手机,不是人的一种

     二.继承的特点

    java只支持单继承,不支持多继承,但支持多层继承

    1.单继承:一个子类只能继承一个父类

    2.多继承:子类同时继承多个父类(在Java中是不允许的)

    3.多层继承:子类继承于父类,而父类也可以有它的父类

    例如:Student 继承于 Person,而Person 继承于 Animal,这就是多层继承

    扩展:Animal就是Student的间接父类,而Person就是Student直接父类

            每一个类都直接或间接继承于Object

    4.多层继承练习:

    (题目来自黑马程序员)

    现在有四种动物:布偶猫、中国狸花猫、哈士奇、泰迪暂时不考虑属性,只要考虑行为。请按照继承的思想特点进行继承体系的设计
    四种动物分别有以下的行为:
    布偶猫:吃饭、喝水、抓老鼠

    中国狸花猫: 吃饭、喝水、抓老鼠

    哈士奇: 吃饭、喝水、看家、拆家

    泰迪:吃饭、喝水、看家、蹭一蹭

    部分代码示范:

    第一段是Animal类,第二段是狗类,第三段是哈士奇类,第四段是测试代码

    1. package Demo;
    2. public class Animal {
    3. public void eat(){
    4. System.out.println("吃饭");
    5. }
    6. public void drink(){
    7. System.out.println("喝水");
    8. }
    9. }
    1. package Demo;
    2. public class Dog extends Animal{
    3. public void lookHome(){
    4. System.out.println("看家");
    5. }
    6. }
    1. package Demo;
    2. //哈士奇类
    3. public class Husky extends Dog{
    4. public void breakHome(){
    5. System.out.println("哈士奇在拆家");
    6. }
    7. }
    1. package Demo;
    2. public class Test {
    3. public static void main(String[] args) {
    4. Ragdoll rd = new Ragdoll();
    5. rd.eat();//间接父类Animal中的,因为直接父类Cat有继承Animal,这就是多层继承
    6. rd.catchMouse();//直接父类Cat中
    7. rd.drink();//间接父类Animal中的,因为直接父类Cat有继承Animal,这就是多层继承
    8. Husky hs = new Husky();
    9. hs.lookHome();//直接父类Dog中的
    10. hs.drink();//间接父类Animal中的,因为直接父类Dog有继承Animal,这就是多层继承
    11. hs.eat();//间接父类Animal中的,因为直接父类Dog有继承Animal,这就是多层继承
    12. hs.breakHome();//哈士奇特有
    13. }
    14. }

    结果展示:

     三.子类到底能继承父类中的哪些内容?

    构造方法: 非私有(public......)的不能,私有(private)的也不能

    成员变量: 非私有的,私有的也

    成员方法: 非私有的,私有的不能(父类中只有虚方法才能被子类继承)

    虚方法: 非private,非static,非final

    四.继承中成员变量和成员方法的访问特点

    1. 继承中成员变量访问特点: 就近原则

    先在局部位置找,本类成员位置找,父类成员位置找,逐级往上

    2.如果出现了重名的成员变量怎么办?

    System.out.printIn(name);//离它最近的name

    System.out.println(this.name);//子类中的name

    System.out.printIn(super .name) //父类中的name

    3.构造方法的访问特点

    (1)父类中的构造方法不会被子类继承
    (2)子类中所有的构造方法默认先访问父类中的无参构造,再执行自己。
    为什么?
    子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化子类将无法使用父类的数据,所以子类初始化之前,一定要调用父类构造方法先完成父类数据空间的初始化。
    如何调用父类构造方法?
    子类构造方法的第一行语句默认都是: super(),不写也存在,且必须在第一行

    如果想调用父类的有参构造方法就要,要自己使用super进行调用

    五.方法重写注意事项和要求

    1.重写方法的名称、形参列表必须与父类中的一致
    2.子类重写父类方法时,访问权限子类必须大于等于父类 (暂时了解:空着不写< protected<       public)

    3.子类重写父类方法时,返回值类型子类必须小于等于父类
    4.建议:重写的方法尽量和父类保持一致

  • 相关阅读:
    Python3高级特性(二)之迭代(Iterable)
    javascript算法之从会用到理解 - 数组反转
    log4j日志漏洞问题
    Hbase
    Spring @DependsOn 和 @ConditionalOnBean 的区别
    叉树的逆向有序遍历(C/C++实现)
    Ubuntu自启动设置
    【CSS3】CSS3 2D 转换 - rotate 旋转 ③ ( 使用 transfrom-origin 设置旋转中心点 | 使用 方位词 / 百分比值 / 像素值 设置旋转中心点 )
    Java-NIO之Buffer(缓冲区)
    redis的使用场景
  • 原文地址:https://blog.csdn.net/guaiwu_/article/details/127956412