数据结构面向对象之继承多态抽象类接口
Posted 特昂唐@
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构面向对象之继承多态抽象类接口相关的知识,希望对你有一定的参考价值。
一、继承
(一)、继承的概述
继承是面向对象的三大特征之一,可以使得子类具有父类的方法和属性,还可以在子类中重新定义,追加属性和方法。
继承的格式
● 格式:public class 子类名extends父类名
●范例:public class Zi extends Fu
●Fu:是父类,也被称为基类和超类。
●Zi:是子类,也被称为派生类。
父类:
子类:
当在测试类里面通过子类调用show 方法时报错,因为show方法在父类,此时我们可以通过子类继承父类来调用show方法。继承以后再调用就不会报错了。
继承前:
继承后:
继承中子类的特点:
●子类可以有父类的内容。
●子类还可以有自己特有的内容。
(二)、继承的好处和弊端
继承好处:
●提高了代码 的复用性(多个类相同的成员可以放到同一个类中)。
●提高了代码的维护性(如果方法的代码需要修改,修改一处即可)。
继承弊端:
●继承让类与类之间产生了关系,类的耦合性增强了,当父类变化时,子类也不得不跟着变化,消弱了子类的独立性。
什么时候使用继承?
●继承体现的关系:is a .
●假设法;我有两个类A和B,如果他们满足A是B的一种,或者B是A的一种,就说他们存在继承关系,这个时候就可以考虑用继承来实现,否则不能乱用继承。
●举例:水果和苹果,动物和猫。
(三)、继承中变量的访问特点
在子类中访问一个变量时:
●子类局部范围找
●子类成员范围找
●父类成员范围找
●如果都没有就报错
(四)、super关键字
super关键字的用法和this关键字的使用方法相似
●this:代表本内对象的引用。
●super:代表父类存储空间的标识(可以理解为父类对象的引用)
(五)、继承中构造方法的访问特点
子类中所有的构造方法都会默认访问父类中无参的构造方法,为什么呢?
●因为子类会继承父类中的数据,可能还会使用父类中的数据,所以,子类初始化之前,一定要先完成父类数据的初始化
●每一个子类构造方法的第一条语句默认都是:super()
如果父类中没有无参构造方法,只有带参构造方法,该怎么办呢?
●通过使用super关键字去 显示的调用父类的带参构造方法。
●在父类中自己提供一个无参的构造方法。
(六)、继承中成员访问的特点
通过子类对象访问一个方法:
●先在子类成员范围找
●再父类成员范围找
●如果都没有就报错
(七)、方法重写
方法重写:
●子类中出现了和父类中一摸一样的方法声明
方法重写的应用:
●当子类需要父类的功能,而功能主体子类有自己特有额内容时,可以重写父类中 的方法,这样,既沿袭了父类中的功能,又定义了子类特有的内容。
●@Override可以帮我们检查重写方法的方法声明的准正确性
方法重写注意事项:
●私有方法不能被重写(父类私有的成员(被private修饰)子类是不能继承的)。
●子类 方法访问权限不能更低(publi > 默认 > 私有)
(八)、继承的注意事项
●Java中类只支持单继承,不支持多继承。
●Java中类支持多层继承。
(九)、权限修饰符
1.final
final 关键字是最终的意思,可以修饰成员方法,成员变量,类
final 修饰的特点:
●修饰方法:表明该方法是最终方法,不能被重写。
●修饰变量:表明该变量是常量,布恩那个再次被赋值。
●修饰类:表明该类是最终类,不能被继承。
final修饰局部变量:
●变量是基本类型:final修饰指的是基本类型的数据值不能发生改变。
●变量是引用类型:final修饰指的是引用类型的地址值不能发生改变,但是地址里面的内容是可以发生改变的。
2.static
static 关键字是静态的意思,可以修饰成员方法,成员变量。
static修饰的特点:
●被类的所有对象共享
这也是我们判断是否使用静态关键字的条件。
●可以通过类名调用
当然,也可以通过对象名调用。推荐使用类名调用。
static 访问的特点:
静态的成员方法只能访问静态成员
二、多态
(一)多态的概述
同一个对象,在不同时刻表现出来的不同形态
举例:猫
我们可以说猫是猫:猫cat = new猫()。
我们也可以说猫是动物:动物animal = new 猫()
这里在不同时刻表现出来的不同形态,这就是多态
多态的前提和体现
●有继承/实现关系
●有方法重写
●有父类引用指向子类对象
(二)多态中成员访问特点
●成员变量:编译看左边,执行看左边。
●成员方法:编译看左边,执行看右边。
为什么成员方法和成员变量不一样呢?
●因为成员方法有重写,而成员变量没有
(三)多态的好处和弊端
●多态的好处:提高了程序的扩展性
具体体现:定义方法的时候,使用父类型作为参数,将来使用的时候,使用具体的子类形参与操作
●多态的弊端:不能使用子类的特有功能。
(四)多态中的转型
首先给出三个类:
动物类:
猫类:
测试类:
●向上转型:从子到父,父类引用指向子类对象
●向下转型:从父到子,父类引用转为子类对象
三、抽象类
抽象类的概述:
在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
抽象类的特点:
●抽象类和抽象方法必须使用abstract关键字修饰。
public abstract class 类名
public abstract void eat();
●抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类。
●抽象类不能实例化
抽象类如何实例化呢?
参照多态的方式,通过子类对象实例化,这叫抽象类多态。
●抽象类中的子类
要么重写抽象类中的所有方法
要么是抽象类
抽象类的成员特点:
●成员变量:可以是变量,也可以是常量;
●构造方法:有构造方法,但是不能实例化
那么构造方法的作用是什么呢?
用于子类访问父类数据的初始化
●成员方法:可以有抽象方法,限制子类必须完成某些动作。
也可以有非抽象方法,提高代码的复用性。
四、接口
(一)接口的概述
接口就是一种公共的规范标准,只要符合规范标准,大家都可以使用
Java中的接口更多的体现在对行为的抽象。
(二)接口的特点
●接口用关键字interface修饰
public interface 接口名
●类实现接口用implements表示
public class类名implements 接口名
●接口不能实例化
接口如何实例化呢?
参照多态的方式,通过实现类对象实例化,这叫接口多态。
多态的形式:具体类多态,抽象类多态,接口多态。
多态的前提:有继承或者实现关系,有方法重写,有父(类/接口)引用指向(子/实现)类对象。
●接口的实现类
要么重写接口中的所有抽象方法,要么是抽象类。
(三)接口的成员特点
●成员变量:只能是常量;
默认修饰符:public static final
●构造方法:接口没有构造方法,因为接口主要是对行为进行抽象的,是没有具体存在的。
一个类如果没有父类,默认继承Object类
●成员方法:知识抽象的方法
默认修饰符:public abstract
(四)类和接口的关系
●类和类的关系
继承关系,只能单继承,但是可以多层继承
●类和接口的关系
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口。
●接口和接口的关系
继承关系,可以单继承,也可以多继承
(五)抽象类和接口的区别
●成员区别
抽象类 变量,常量;有构造方法,有抽象方法,也有非抽象方法
接口 常量;抽象方法
●关系区别
类与类 继承,单继承
类与接口 实现,可以单实现,也可以多实现
接口与接口 继承,单继承,多继承
●设计理念区别
抽象类 对类抽象,包括属性,行为
接口 对行为抽象,主要是行为
以上是关于数据结构面向对象之继承多态抽象类接口的主要内容,如果未能解决你的问题,请参考以下文章
Python全栈之路系列----之-----面向对象4接口与抽象,多继承与多态)