day12 多态、抽象类、接口

多态

一、什么是多态:父类引用指向子类对象(父类型声明的引用类型变量可以找到子类的对象,也就是子类对象的地址给到了父类引用类型的变量)
多态又叫向上转型

二、多态是发生在赋值的时候,多态发生的几种形式
1、直接多态(直接声明的多态) 父类 变量=new 子类();
2、形参和实参多态 方法参数定义时,使用父类定义,调用方法时,传递子类对象
3、返回值多态 返回值类型定义为父类,返回数据的时候返回子类对象

三、多态的优缺点
缺点:丢失子类特有的属性,无法调用子类特有的属性,特有属性需要向下转型后,再进行访问
优点:把不同的子类对象都当做父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,以适应需求的不断变化

四、多态发生的前提条件:必须是在有继承关系的体系中

五、多态调用属性的规则
1、如果调用的是父类没有的,直接报错,访问不了
2、如果调用的是子类没有的,都访问父类的
3、如果调用的是父类和子类都有的,那么除了成员方法调用子类的之外,其他的都调用父类的,因为成员方法可以覆写。

六、多态如何使用?
1、直接多态 若Animal是父类,Cat是子类,那么Animal a1=new Cat();是直接多态
2、实参形参多态 若Animal是父类,Cat是子类,那么实参形参多态为
Cat c1=new Cat();
m1(c1);
public static void m1(Animal a){

}
相当于Animal a=Cat c1
3、返回值多态
Animal a2=m2();
public static Animal m2(){
return new Cat();
}
4、隐式多态
this类型是当前类类型,也就是this在哪个类中出现,this的类型就是这个类
那么 这里的this 就等于是 SupClass this 那么 this的引用 是子类对象,再结合this 是当前类类型 所以成了这样 SupClass this = new SubClass();
下面的main方法中执行subClass.m1()时,m1方法中的this发生了多态
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
七、Instanceof与向下转型
多态又叫向上转型,可以看做自动类型转换,从子类到父类

向下转型,可以看做强制类型转换,从父类到子类,必须先发生向上转型

instanceof 判断该对象是否有某个类实例化而来
在这里插入图片描述

抽象类

八、Abstract
抽象类往往用来表示设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
比如:动物,它只是一个抽象的概念,并没有一个 “东西”叫做 “动物”。所以,它并不能代表一个实体,这种情况下,我们就适合把它定义成抽象类。

使用abstract 修饰的类,是抽象类, 抽象类的目的 : 该类不能被实例化对象,只能被继承

使用abstract 修饰的方法,是抽象方法,抽象方法没有方法体,只有功能 定义,没有功能实现,用于让子类实现

实现抽象方法,就是给抽象方法加上方法体,去掉abstract修饰

抽象方法一定在抽象类中,但是抽象类中一定有抽象方法是不成立的,也可以没有,如果就想让某个类不能创建对象,也可以把该类创建类抽象类

final与abstract

  • final修饰的类不能被继承,
  • final修饰的成员方法不能被覆写

而 抽象类 就是用于被继承的,抽象方法就是用于被实现覆写的,所以 final 和 abstract 不能同时出现

  • 一个非抽象类如果要继承一个抽象类,必须要实现该类的所有抽象方法
  • 一个抽象类如果要继承一个抽象类 ,可以实现 0~N个抽象方法

以下是代码示例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接口

九、interface

  • 接口是一种引用数据类型,可以看做是一种特殊的类,是java为了解决没有多继承引起的功能变弱的问题

  • 一个类只能有一个父类,但是可以实现N个接口

  • 创建接口的方式 由 class 变成了 interface 而 父子关系 用 extends 变成了 implements

  • 类和类 使用extends,并且单继承

  • 类和接口 使用 implements 多实现 多个以逗号隔开,比如 class A implements V,C,D

  • 并且 非抽象类实现接口后,必须实现所有的抽象方法

  • 抽象类实现接口后 可以实现 0~N个抽象方法

  • 接口和接口 使用 extends,并且是多继承 比如 interface A extends B,C,D

  • 语法 :
    public interface 接口名{

    }

  • 1 接口中 所有的变量 默认都是 public static final 的 也就是常量 ,而且 public static final 可以省略

  • 2 接口中的方法 默认都是 public abstract 的 也就是抽象方法,而且 public abstract 可以省略

  • 3 接口中没有构造方法,不能被实例化对象

  • 从 java1.8开始 接口中 可以有 默认方法和 静态方法

  • 接口可以看做是一个特殊的抽象类,所以很多时候 接口和抽象类都能做到某一件事

  • 优先使用接口,因为 类和接口之间是多实现, 当使用接口之后,还可以保留类的继承

接口如何使用呢?
以下是代码实现:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
十、接口和抽象类

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值