JAVA八 多态抽象接口

一、多态

java面向对象的三大特征:封装 ,继承,多态、
有了封装,对象和对象之间才产生了继承
继承是多态的基础 重写也是多态的基础
有了继承之后,才有了方法的覆盖和多态

1、为什么需要多态什么是多态

降低程序的耦合度,提高程序的扩展性
为了解决问题的

多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型赋值给父类类型。

多态的前提是继承和方法重写

多态:父类对象表现多种子类的形态的能⼒的特征,⼀句话多态就是⽗类引⽤⼦类对象。 向同⼀个⽗类不同⼦类发送同⼀条消息,⾏为不同。
需求1:动物园让我们实现一个功能: 创建一个狗类 ,狗有eat()函数,再创建一个饲养员类,饲养员有一个feed()函数,让饲养员喂养狗。

思考:狗为什么非要人喂,狗不能自己吃吗?

以后我们的代码,都是从一个类去调用另一个类,形成一个调用链。

需求2:此时动物园引进新品种 猫,此时需要创建一个猫类。并添加eat函数,让人类也能喂养猫。

需求3:此时动物园又引进了一种新动物,叫做pig猪 此时pig也有eat 并且 人类也需要喂养pig,请完成功能。

在这里插入图片描述

2向上转型

向上转型: 父类引用子类对象 (不能在调用子类中父类没有的方法,必须调用的是子类父类都有的方法)
在这里插入图片描述
向上转型后该对象只能当成父类对象来用,原来子类中定义的属性和方法就被屏蔽掉不能被调用了。比如狗里有一个【看门】的方法,如果向上转型后作为【动物】类就不能调用dog类独有的【看门】的方法。

编译看是从左向右的 虽然执行的是子类的,但是父类没有的话会在编译期就直接报错

3、向下转型

向下转型:⼦类引⽤⽗类对象(强制转换,慎重)
在这里插入图片描述
本来就是Teacher类的 转成Person后 向下转型只能转成本身的类型 Teacher
在这里插入图片描述
这些都是继承多态
接口多态比较多

二、抽象类

1、abstract修饰的类是抽象类,抽象类不能new
2.、抽象类可以没有抽象方法
3、由抽象方法的类必须是抽象类
4、子类必须重写父类的抽象方法,否则子类也定义成抽象类
5、抽象类没有方法体 ,被abstract修饰

2.1、为什么要抽象

例如刚才的
1、人能喂养 Animal 吗?
不能:因为Animal只是我们抽象出的一个父类,为了更好的解决代码问题。Animal并不是实际存在的对象。但是人可以喂养确定的某一个动物。
2、Animal可以吃吗?(这个时候就类似抽象的)
能:可以吃,但是只是具有吃的行为。

动物都有吃的行为,但是一定要具体到某一个动物我们才可以说这个动物吃什么。
3、Animal类中不写eat()可以吗?
不可以。因为子类的eat()是继承并重写父类的eat()方法,如果不写编译都不能通过。
因为多态的前提是继承和方法重写。
4、子类中不写eat()可以吗?
可以,但会直接运行父类的eat方法此时就是没有意义啦

为子类提供服务意义

2.2什么是抽象

在这里插入图片描述
抽象的父类只有相应的行为,但是不具体。具体的行为要在每一个具体的子类中才有。

2.3、抽象方法和抽象类

抽象类的存在不是为了创建对象,是为了让子类继承用的。
关键字abstract
抽象类(抽象类里面不是必须有抽象抽象方法)

[权限修饰符]  abstract  class  类名{
    
    }

抽象方法(抽象方法没有方法体,有抽象方法就必须有抽象类)

[权限修饰符]  abstract  返回值  方法名();//没有大括号

在这里插入图片描述

2.4、使用方法

1、使用abstract修饰的类抽象类
2、抽象类可以有构造,但不能new
3、抽象类归根结底还是一个类,是为了服务子类的父类,可以有普通属性和方法
4、如果子类不行实现父类的方法就必须也进行抽象化

三、接口

概念
接口:是一个规范,让其他东西来遵守这个规范 就是定义规则

接口其实也是一个抽象类
Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
接口的格式

[权限修饰符] interface 接口名{
    
    }

JDK8之前,接口四全局常量黑抽象方法组成,抽象方法不允许有方法体,JDK8进行重新定义了 接口中除了抽象方法外,还可以有默认方法和静态方法(也称为类方法),默认方法使用default修饰 静态方法使用static修饰,两种方法都允许有方法体

接口使用interface关键字声明

[权限修饰符] class 类名 implements 接口1,接口2,接口3。。。{
    
    }
		public class Mouse implements USB{
    
    }
		public static final //数据类型 常量名=常量值
		public default //返回值类型 抽象方法名(参数列表){}默认方法
		public abstract 返回值类型 方法名 (参数列表){
    
    
			//类方法的方法体
}

接口的实现类必须(覆盖重写)实现 接口中所有的抽象方法

常量

 public static final int AGE = 10;

直接使用 接口名.常量名

抽象方法 public和abstract可以省略

public abstract 方法名(){}

在这里插入图片描述

面向接口的编程

接口多态的一个体现 面向过程----》面向对象----》面向接口编程。

接口和抽象的区别

1.接口:interface 抽象:abstrac class
2.接口是多实现的, 抽象类是继承的 是单继承的 java是多线程 单继承的
3.接口不是类,所有接口没有构造方法,没有普通方法
接口没有普通属性 接口中的属性都是 公开静态的常量 是默认的
4.抽象类也是一个类 (是一个特殊的类)有构造,继承的子类new的默认调用父类构造;普通属性
普通方法,抽象方法。

Guess you like

Origin blog.csdn.net/qq_45438019/article/details/119561035