【Java基础知识 9】面向对象—多态

目录

9.1 多态的概念

9.2 方法重写

9.2.1 方法重写的规则

9.2.2 方法重写与方法重载的区别

9.2 动态方法调度与运行时多态

9.2.1 动态方法调度

9.2.2 运行时多态

9.2.3 多态的两种形式

9.3 多态实例

9.4 多态应用

9.5内部类


9.1 多态的概念

同一个方法名称,执行不同的操作。方法重载就是一种多态的一种形式。

9.2 方法重写

当子类从父类中继承来的方法不能满足需要时,子类可以重写该方法,重写方法要求方法名与参数列表都相同。

因此如果子类中的方法与父类中的方法同名、并且参数类型也相同,那么子类中的方法就重写了父类中的同名方法。

为什么不直接定义另外一个方法?因为重写方法可以实现运行时多态的效果。

注意:重写只针对方法,属性没有重写概念

9.2.1 方法重写的规则

两同:方法名相同、参数列表相同

两小:返回值类型更小(子类)或相等、抛出的异常类更小或相等

一大:访问权限更大或相等

案例复习:

Student、Teacher重写Person中的sleep()、show()方法

Dog、Cat重写Animal中的eat()、show()方法

WeightBox、ColorBox重写Box中的show()方法

重写Shape类中的area()方法

重写fruit类中的show()方法

9.2.2 方法重写与方法重载的区别

只有当两个方法的名称和类型签名都相同时才会发生重写。如果不是都相同,那么这两个方法就只是简单的重载关系。

9.2 动态方法调度与运行时多态

9.2.1 动态方法调度

当通过父类引用调用重写方法时,在运行时会调用子类中的重写版本。

动态方法调用要以方法重写为前提。

Animal a;

a = new Dog();

a.eat(); //动态方法调度:在运行时根据超类引用指向的对象确定调用哪个方法

9.2.2 运行时多态

运行时多态的实现机理:动态方法调度

总结:方法重写是前提、动态调度是手段、多态是最终的目的

运行时多态的优点:灵活

Animal a;

a = new Dog();

a.eat();

a = new Cat();

a.eat(); //运行时多态:方法名相同,得到的结果不同

运行时多态的两个要素:

(1)在子类中重写超类中的方法

(2)使用超类引用调用重写方法。

在自己的类中定义的toString()方法就是重写方法。

注意不要混淆:

使用超类引用调用成员变量时,调用的是超类的成员变量。

9.2.3 多态的两种形式

运行时多态:动态方法调度实现

编译时多态:重载方法,编译时通过方法匹配实现的

9.3 多态实例

实例1:Animal、Dog、Cat类的eat()方法、show()方法

实例2:Person、Student、Teacher、Worker类的show()方法、eat、sleep

实例3:Fruit、Apple、Banana的Show()方法

实例4:Shape、Rectangle、Circle、Triangle类的area()、draw()方法

9.4 多态应用

案例1:Feeder类,喂养Dog、Cat

案例2:Manager类,管理Student、Teacher、Worker

案例3:Salesman类,卖水果

案例4:Engineer类,使用Shape类

9.5内部类

在类内部也可以定义另一个类。如果在类Outer的内部再定义一个类Inner,此时类Inner就称为内部类,而类Outer则称为外部类。

成员内部类

public class Outer {

public int age;

private String name;

//成员内部类

public class Inner{

private String password;

public void in_method(){

System.out.println("方法");

}

}

public void out_method(){

System.out.println("外部方法...");

}

}

访问成员内部类中的方法:

第一种:可以通过外部类方法创建内部类对象进行访问

第二种:在外部直接创建内部类对象

语法:外部类.内部类 内部类名称 = 外部类实例.内部类实例

外部类.内部类 内部类名称 = new 外部类类名().new 内部类类名()

Outer.Inner inner = new Outer().new Inner();

inner.in_method();

外部类想要访问内部类成员,需要创建内部类对象

内部类想要访问外部类成员,直接访问

如果成员内部类中的方法种出现局部变量、内部类中的成员变量、外部类中的成员变量出现重名,我们需要严格区分:

访问局部变量 直接输入变量名称 age

访问内部类中的成员变量 this.变量名称 this.age

访问外部类中的成员变量 外部类类名.this.变量 Outer.this.age

静态内部类

被static修饰的成员内部类,叫做静态内部类

外部创建静态内部类语法:

外部类.内部类 内部类名称 = new 外部类类名.内部类类名();

Outer02.Inner02 inner02 = new Outer02.Inner02();

方法内部类

如果内部类出现在方法的位置,那么就叫做方法内部类

匿名内部类

匿名对象 new 类名()

匿名内部类 ====== 匿名子类

new 类名(){}

当方法中出现参数为父接口或者父类时,可以尝试使用多态+匿名内部类语法

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值