多态&抽象类&接口

多态

什么是多态?
同一个对象,在不同时刻表现出来的不同形态

多态的前提条件

1.有继承/实现的前提
2.有方法的重写
3.有父类引用指向子类对象

多态中的成员访问特点

例:Animal a=new Cat();
⊙成员变量访问
父类中有的属性,才能正常编译(编译看左边),如子类也有相同属性,访问执行出来的是父类中的属性值
⊙成员方法访问
父类中要有该方法,才能通过多态访问,否则编译报错,若子类重写该方法,通过多态形式访问该方法执行出来的是子类中重写的方法
总结就是:例:Animal a=new Cat();
…多态形式中,
…成员变量,编译看左边,执行看左边
…成员方法:编译看左边,执行看右边

多态的好处和弊端

1.好处
提高代码的拓展性
体现在定义方法时,将父类型作为参数时,可以使用具体的子类型,则使用重写的方法时,使用的是该子类重写的方法,如图

在这里插入图片描述
2.弊端
不能使用子类特有的功能
使用多态时,子类中特有的方法,只能通过向下转型,进行访问

多态中的转型

(能解决多态的弊端)
1.向上转型
父类引用指向子类对象
在这里插入图片描述
2.向下转型
父类引用转为子类对象,转型的是父类引用所指向的那个子类对象
在这里插入图片描述

抽象类

概述:
1.抽象方法:一个没有方法体的方法应该被定义为抽象方法
2.抽象类:一个类中有抽象方法就被定义为抽象类
那么为什么要有抽象类呢?
当父类定义一些方法,不知道子类具体要怎么操作时

抽象类的特点

1.必须使用abstract关键字修饰
包括抽象方法和类

2.抽象类中可以有抽象方法(可以没有,但没有意义),成员方法,成员变量
但是抽象方法的类一定是抽象类

3.抽象类不能实例化
…但是可以使用抽象类多态的形式实例化,即通过其子类进行实例化*

4.抽象类的子类:.要么重写抽象类中的方法,要么是抽象类

抽象类的成员特点

1.除了有抽象方法,和一般类类似,也有构造方法
为什么不能被实例化,要有构造方法?*
---------不能被初始化,用构造方法主要是用于子类访问父类是,对父类数据初始化用的*

2.关于成员方法作用
有抽象方法:限定子类必须完成某些动作
有非抽象方法:为了提高代码的复用性

最后,阻止对象被创建,可以有两种方法:
1.定义该类为抽象类
2.将构造方法私有private(只能该类可以使用自己)

接口

概述:
接口是一种公共规范标准,可以理解为附加的功能,本质是对行为的抽象

接口的特点

1.定义和实现
… a.使用关键字interface定义
…b.使用关键字implements实现

2.不能被实例化
a.可以参照多态的形式实例化
b.多态的形式:具体类多态,抽象类多态,接口多态
c.多态的前提:
…1.有继承/实现的关系
…2.有方法重写
…3.有(父类/接口) .引用指向(子类/实现)对象
3.接口的实现类
a.要么重写接口中的方法
b.要么是抽象类

接口中的成员特点

1.只有常量,被public static final 默认修饰

2.没有构造方法
…实现类中能调用super()方法,不是调用接口中的构造的原因,而是,所有类直接或间接继承自Object

3.只能有抽象方法,默认被public abstract修饰

类与接口的关系

在这里插入图片描述
特别说明:这里多实现,实现接口用逗号隔开,接口与接口之间可以实现多继承关系

抽象类和接口的区别

1.成员的区别
…接口中只有常量和抽象,没有构造方法

2.关系区别
…类与类…继承,单继承
…类与接口…实现和多实现
…接口与接口…继承和多继承

本质:抽象类强调的是对事物的抽象,接口强调的是对行为的抽象

案例:
设计区别:
门的开关方法是抽象的概念 可以用抽象类,接口定义都可以
但是附加某种抽象的方法(比如给门加报警功能),不管附加在哪个(抽象类/接口)里面,实现后继承的类,都要在重写该方法(新加的抽象方法)

所以最好的解决方法:
定义一个接口(写入附加的功能),再定义一个抽象方法,谁要增加该功能就实现即可
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_18361601/article/details/103967145