JavaSE基础 第十三章 方法的覆盖和多态

目录

    • 1.方法覆盖
      • 1.1什么时候使用方法覆盖
      • 1.2构成方法覆盖的条件
      • 1.3toString()的覆盖
      • 1.4方法覆盖与方法重载的区别
    • 2.多态的基础语法
      • 2.1向上转型与线下转型
      • 2.2静态绑定与动态绑定
      • 2.3什么时候需要向下转型
      • 2.4向下转型的风险
      • 2.5如何避免类型转换异常
    • 3.多态在开发中的作用
      • 3.1软件开发基本原则
      • 3.2覆盖与多态的关系
  • 传送门

1.方法覆盖

1.1什么时候使用方法覆盖

方法覆盖、方法重写、override:子类继承父类之后,继承过来的方法无法满足当前子类的业务需求是,子类可以对方法重写

1.2构成方法覆盖的条件

  1. 两个类必须要有继承关系
  2. 重写之后的方法和之前的方法具有:
    (1)相同的返回值类型
    (2)相同的方法名
    (3)相同的形式参数列表
  3. 访问权限不能更低,可以更高
  4. 重写后的方法不能比之前的方法抛出更多的异常,可以更少

注意点:

  • 方法覆盖只是针对方法,和属性无关
  • 私有方法无法覆盖
  • 构造方法不能被继承,所以构造方法不能不能被覆盖
  • 方法覆盖只是针对实例方法,静态方法覆盖没有意义 (静态方法针对类与对象无关,而多态与对象有关)
  • 对于返回值类型为基本数据类型,必须一致;返回值数据类型为引用数据类型,重写之后的返回值类型可以更小(意义不大)

1.3toString()的覆盖

System.out.println(引用)//println()方法先自动调用“引用.toString()”,然后输出toString()方法的执行结果

1.4方法覆盖与方法重载的区别

  • 方法重载发生同一个类中
  • 方法覆盖是发生在具有继承关系的父子类之间
  • 方法重载是一个类中,方法名相同,参数列表不同
  • 方法覆盖是具有继承关系的父子类,并且重写之后的方法必须和之前的方法:方法名、参数列表、返回值类型一致

2.多态的基础语法

2.1向上转型与线下转型

  • 向上转型:子→父(自动类型装换)父类型引用指向子类型对象 Animal cat = new Cat() ; (upcasting)
  • 向下装换:父→子(强制类型转换,需添加强制装换符)之内只能怪引用指向父类型对象 Cat c = (Cat) cat; (downcasting)

注意:无论是向下转型还是向上转型,两种类之间必须有继承关系,没有继承关系编译器会报错

2.2静态绑定与动态绑定

多态表示多种形态:编译的时候一种,运行的时候一种
例如向上转型:Animal a = new Cat(); a.move();

  1. 编译阶段:绑定父类方法;对于编译器来说,只知道a是Animal类,由Animal.class找导move()方法,绑定上,被编译通过【编译阶段属于静态绑定】
  2. 运行阶段:动态绑定子类型对象的方法;在堆内存中创建的实际为Cat对象,动态执行Cat对象的move()方法
    【运行阶段为动态绑定】

2.3什么时候需要向下转型

需要访问的是子类对象中“特有”的方法,才余姚向下转型。不要随便向下转型

Animal cat = new Cat();
//cat.catchMouse();  错误,编译阶段Animal没有catchMouse()方法
Cat c = (Cat) cat;
c.catchMouse();//正确

2.4向下转型的风险

Animal a6 = new Bird();
Cat y =(Cat)a6;
y.catchMouse;

编译没问题,运新阶段出问题:java.lang.ClassCastException(类型转换异常) 【Bird、Cat类之间没有继承关系】

2.5如何避免类型转换异常

instanceof(运行阶段动态运行),对类型进行向下转型是,一定要用instanceof运算符进行判断

引用 instanceof 类型
if(a6 instanceof Cat){
	Cat y = (Cat) a6;
	y.catchMouse();
}

为什吗要用instanceof判断
分工时,你不知道别人会传递什么类型的对象

public void test(Animal a){
	if (a instanceof Cat){
		Cat c = (Cat)a;
		c.catchMouse;
	}else if(a instanceof Bird){
		Bird b= (Bird)a;
		b.sing();
	}
}

3.多态在开发中的作用

3.1软件开发基本原则

OCP(开闭原则):对扩展开放,对修改关闭。
在软件的扩展中,修改的越少越好,修改的越多,系统当前的稳定性就越差,位置的风险就越多
建议:面向抽象编程,不推荐面向具体编程

3.2覆盖与多态的关系

联合起来使用才有意义:

Animal a = new Cat();
a.move;

编译过程中方法为父类的
运行的时候调用覆盖之后子类的方法
没有多态,方法覆盖可有可无,子类可以定义父类方法无法满足子类需求的全新方法

传送门

上一章:JavaSE基础 第十二章 继承
下一章:JavaSE基础 第十四章 super

你可能感兴趣的:(JavaSE基础)