继承

  • 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模
  • extends的意思是“扩展”。子类是父类的扩展
  • Java中类只有单继承,没有多继承
  • 继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖,组合,聚合等
  • 继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示
  • 子类和父类之间,从意义上讲应该具有“is a”的关系
  • 在Java中,所有的类,都默认直接或者间接继承Object
  • 子类继承父类,就会拥有父类的全部方法
  • Object类
  • super
    • super调用父类的构造方法
    • super必须只能出现在子类的方法或者构造方法中
    • super和this不能同时调用方法
    • super和this代表的对象不同:
      • this:本身调用着这个对象
      • super:代表父类对象的应用
    • 前提:
      • this:没有继承也可以使用
      • super:只能在继承条件下才可以使用
    • 构造方法:
      • this();本类的构造
      • super();父类的构造
    • 一个构造函数中不能同时出现this和super两种方法是因为this函数中也有super,这会导致初始化两次数据不安全
    • 举个例子,子类跟父类中都有一个叫print的方法,this.print()调用的是子类的print方法,super.print()调用的是父类的方法
  • super 关键字的功能
    • 调用父类中声明为 private 的变量。
    • 点取已经覆盖了的方法。
    • 作为方法名表示父类构造方法。
  • 方法重写----->多态
    • 重写:需要有继承关系,子类重写父类的方法!
      • 方法名必须相同
      • 参数列表必须相同
      • 修饰符:可范围可以扩大 public>Procted>Default>private
      • 抛出的异常:范围可以被缩小,但不能扩大:ClassNotFoundException --->Expection(大)
    • 重写,子类的方法和父类必须要一致,方法体不同!
    • 为什么要重写:
      • 父类的功能,子类不一定需要,或者不一定满足!
    • 重写快捷键:ctrl+o alt+inster
关于继承的讲解
关于Super的讲解

方法的重写

静态重写:

Application:

package com.xf2021.Demo;

public class Application {
    //静态的方法跟非静态的方法区别很大
    public static void main(String[] args) {
        //父类的引用指向了子类
        B b = new A();//子类重写了父类的方法
        b.test();//B
    }
}

A:

package com.xf2021.Demo;
//继承
public class A extends B{
    public static void test(){
        System.out.println("A=>test()");
        System.out.println("test");
    }
}

B:

package com.xf2021.Demo;
//重写都是方法的重写,和属性无关
public class B {

    public static void test(){
        System.out.println("B=>test()");
    }
}

Application输出结果:

B=>test()

进程已结束,退出代码为 0

动态重写:

Application:

package com.xf2021.Demo;

public class Application {
    //静态的方法跟非静态的方法区别很大
    public static void main(String[] args) {
        //父类的引用指向了子类
        B b = new A();//子类重写了父类的方法
        b.test();//B
    }
}

A:

package com.xf2021.Demo;
//继承
public class A extends B{
    public  void test(){
        System.out.println("A=>test()");
        System.out.println("test");
    }
}

B:

package com.xf2021.Demo;
//重写都是方法的重写,和属性无关
public class B {

    public  void test(){
        System.out.println("B=>test()");
    }
}

Application输出结果:

A=>test()
test

进程已结束,退出代码为 0

个人理解:重载与重写存在很大区别。重载是在同一个类之间,相同的方法名,不同的参数设置。而重写则是在子父类之间,重写就是子类继承父类的方法后,可以对父类中某一方法进行重新编写,如上代码所示,假设父类(B类)中有很多方法,子类(A类)在继承了父类的所有方法后,如果想自己重写父类中的某个方法,可以在子类中写上和父类中想要重写的方法的方法名(这里以test()为演示)。前提是子类跟父类中的方法都是动态的(非static),这样子类中重写的跟父类中一模一样名字的方法就会覆盖父类中的同名方法, B b = new A(); b.test()的时候会调用在A类中重写的test方法;而如果父类跟子类中的方法都是静态的(static),则子类在继承父类时,同名的方法相当于被父类中的方法所覆盖,我们调用 b.test() 时也只能调用父类中的test方法

注解: B b = new A(); 是父类的引用指向子类的对象,向上造型。是父类指针指向了子类对象。如下图所示:

如上图所示的四种情况,B b = new A(); 前面后面两个类,哪个类在前哪个类就掌握主动权。 B b = new A(); 与 A b = new A(); 不同的是:在Static下,前者是B类的权限大于A类,我们侧重强调B类,A类重写的静态方法会被B类直接覆盖,而后者是A类的权限大于B类,A类重写的静态方法会覆盖B类。

但你可能会问,非静态下没有什么区别 B b = new A(); 与 A b = new A(); 都一样。像前者那样写是为学习多态做准备,而且有重写的地方new相应对象的时候,基本没有像后者那么写的


You got to put the past behind you before you can move on.