面向对象之5:面向对象三大特性之 继承 、super关键字 的总结:

目录

继承后子类创建对象的简要内存图示:

 

继承后创建对象的流程图示:

继承后创建对象的执行过程:

继承的特点总结:

继承的好处:

super关键字的总结:

super和this的区别:


继承后子类创建对象的简要内存图示:

代码比如:

package indi.jonny.extend;

public class Grandpa {
    String name = "大头爷爷";
    String interest = "下象棋";
    protected int wealth = 50000000;

    public Grandpa(){
        System.out.println("父类的父类构造器");
    }
}

package indi.jonny.extend;

public class Dad extends Grandpa {
    String name = "大头爸爸";
    private int wealth = 100000000;

    public Dad(){
        System.out.println("父类构造器");
    }

    public int getWealth(){
        return this.wealth;
    }
}

package indi.jonny.extend;

public class Son extends Dad {
    String name = "小头儿子";
    int age = 10;

    public Son() {
        /*super(); 构造器第一行默认有 super();无参构造器,
        如果父类没有无参构造器那么则需要 super(形参列表); 手动指定其他构造器完成父类初始化的操作!*/ 
        System.out.println("子类构造器" + "\n");

        System.out.println("this.hashCode() = " + this.hashCode());
        System.out.println("this = " + this + "\n");
    }
}

test:

Debug时  this:


 

继承后创建对象的流程图示:


继承后创建对象的执行过程:


继承的特点总结:

  1. 继承关系:继承的叫法:被继承的类--》父类or基类or超类  继承的类 ---》子类or派生类  ,子类继承父类一定要在合理的范围中进行继承的
  2. 继承语法:子类 extends 父类
  3. 子类继承了父类所有的实例属性和实例方法,父类非私有的属性和方法可以在子类中直接访问,父类private修饰的内容,子类实际上也是继承了的,只是因为封装的特性阻碍了子类直接访问,但父类可以提供间接访问的访问方式,让子类得以访问!
    1. 父类的私有方法不能被子类重写。
  4. (父类中的静态内容属于父类本身,并没有被子类继承下来,子类子所以能访问是因为静态的内容是 子父类 共享的!)
    1. 父类的静态方法不能被子类重写。
  5. 子类调用属性或者方法时会按照查找关系来返回信息:(简单来说就是:子类没有找父类,父类没有就报错!!!)
    1. 首先会检查子类中是否有访问的 属性或者方法。
    2. 如果子类中有要访问的属性或者方法,并且可以访问,则返回信息。
    3. 如果子类中没有这个属性或者方法,就会检查父类中有没有要访问的属性或者方法(如果父类中有要访问的属性或者方法,并且可以访问,就返回信息。)
    4. 如果父类中没有的话,就会按照(3)的规则,继续找上级父类,直到Object……如果都没有。就报错。
    5. 如果子类和父类中有相同的属性或者方法,那么就会按照 就近原则 优先访问最先检查到的那个属性或者方法!哪怕检查到的是父类私有的属性或者方法也不会继续向上检查。
      1. 比如:当Son类对象直接访问wealth的属性,检查到Son的父类Dad类里面有就会停止检查,就算没有提供可以访问的方法,就算Dad类私有了wealth也不会继续检查Dad的父类Grandpa类有没有wealth属性
  6. 子类必须调用父类的构造器,完成父类的初始化!
  7. 当创建子类对象的时候,不管子类使用哪个构造器,默认情况下都会去调用父类的无参构造器完成父类的初始化,如果父类没有提供无参的构造器,那么必须在子类的构造器中用 super. 去指定调用父类的其他构造器完成对父类的初始化工作。否则,编译报错!(所以最好定义有参构造器的时候,把无参构造器也显式的编写出来!)
  8. 如果子类希望去调用父类的某个构造器,则需要显示的调用一下即可: super(形参列表);
  9. super在使用的时候,必须放在构造器的第一行,(super(形参列表); 调用父类构造器的语句只能在子类构造器中使用)。
  10. super(形参列表) 和 this(形参列表) 都只能放在构造器中的第一行,所以不能同时调用父类的构造器和子类的构造器。二选一!
  11. Java中所有的类都是Object类的子类,Object类是所有类的根基父类!所有的类都直接或者间接的继承自Object类!
  12. 父类构造器的调用不限于直接父类,它会一直往上追溯到Object类(根基父类
  13. Java中的继承是单继承!语言特性决定好了,一个类可以有多个子类,一个子类只能有一个直接父类!,但是一个类可以间接继承自个父类(继承具有传递性!)。Java中的实现是多实现的关系,可以通过接口实现 多实现(有人叫多继承)的关系。
  14. 不能滥用继承,子类和父类之间的继承关系必须满足 is-a 的继承关系。
  15. 子类的功能比父类的更为强大。
  16. 先有父类,再有子类叫  继承,先有子类,再向上抽取父类叫 泛化。

继承的好处:

  1. 提高了代码的复用性,父类定义的内容,子类可以通过继承直接使用,不用再代码上重复定义。
  2. 便于代码的扩展。
  3. 继承是多态的前提,换言之 多态的前提必须是  继承关系 or 实现关系!

 


super关键字的总结:

  1. super 代表父类的,用于在子类中访问父类的属性、方法、构造器。
  2. super 访问父类的属性,但是不能访问父类 使用 private修饰的属性!
  3. super 访问父类的方法,但是不能访问父类 使用private修饰的方法!
  4. super访问父类的构造器,格式:super(形参列表); 只能放在子类构造器中的第一行,子类构造器中使用super调用父类的构造器只能出现一句!不同同时访问两个父类构造器,这一点和this同理!
  5. 在子类构造器中如果父类有无参构造器,那么子类所有的构造器的第一行 都隐式的有super();来调用父类的无参构造器!如果父类中没有无参构造器,那么就必须要手动指定访问父类中的其他构造器!完成父类的初始化操作!
  • 调用父类构造器的好处(分工明确,父类的属性由父类初始化,子类的属性由子类初始化!(先有父再由子,这很符合常理!所有的父类都初始化完之后子类将会继承所有的父类的所有内容!))。
  • 当子类中有和父类中属性和方法重名时,如果是在子类实例方法中 为了访问父类的非私有 成员属性或者非私有 成员方法时,那么就必须通过 super来进行访问!如果没有重名,使用super、this、和直接访问 是一样的效果!(super或者this可以省略不写,因为子类已经继承了父类的非私有 所有成员!)
  • super 的访问不局限于直接父类,如果访问的属性或者方法在直接父类中没有,在父类的上级父类中有的话,也可以直接通过super去访问父类的上级父类中的属性或者方法!
  • super只能在子类的实例方法中使用,在有必要的情况下 可以使用super关键字在子类的实例方法中 调用父类的 实例成员or静态成员 都可以,不能在子类的静态方法中使用super关键字,在静态方法中如果调用父类的静态成员,则需要用 父类名.静态成员,即可。在子类的静态方法中,如果 在有必要的情况下!如果是调用父类的实例成员,则需要创建父类对象!(父类 非私有 静态的成员  子类已经可以共享了,所以此时创建子类对象调用和创建父类对象调用,效果是一样的!!!!)。
  • 如果多个基类(上级类)中有同名的属性或者方法,使用super访问依然遵循就近原则,(优先访问最先检查到的。当前也会遵守访问权限修饰符的相关规则!)。

super和this的区别:

补充:super表示 父类引用,可以使用 super 访问 父类中 不是 用 private 修饰的 实例or静态 内容,前提是super关键字必须在子类的实例方法中使用 !!!!!


 

下一篇:面向对象之6:继承后方法重写、权限修饰符(public、protected、缺省、private) 的总结:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值