Java基础第十三天 - 多态,抽象,接口

一、多态

解决了同一事物不同状态的问题

多态的前提

1.类和类之间是继承关系

2.子类有方法的重写

3.有父类的引用去指向子类

1.类之间有继承关系才能有多态的概念

2.子类没有方法的重写,多态就没有意义。

3.我有一个 父类 A;一个子类 B;   此时我定义一个对象     A a = new B (); 

这就是父类的引用指向子类。

多态的优点

首先因为多态是根据继承得来的,所有多态具有可维护性

然后多态可以体现同一事物不同状态,所有它具有可扩展性

多态的缺点

不能调用子类特有的成员方法和变量 

(有解决方法)

多态中各成员的特点

我们将程序运行分为 编译和结果 两个阶段

1.成员变量

编译看左边,运行也看左边,即:运行得到的结果是父类的。

2.成员方法

编译看左边,运行看右边,即:运行得到的结果是子类的。

3.构造方法

因为继承关系,子类调用父类构造方法先初始化父类

4.静态方法

编译看左边,运行看左边。因为子类写的静态方法它不是重写。所有运行不会得到子类。

多态中访问子类特有的成员方法

1.   new  一个子类的对象去接收,然后在调用。(没意义,还占空间)

2.用强制转换   比如  

这样就可以得到 dog中特有的方法。

向上转型和向下转型

多态就是一个典型的向下转型,将父类的指向变为子类。

而访问子类的特有方法就是典型的向上转型,定义一个子类的对象,这个对象指向强行转换的父类。

二、抽象

当一个事务没有具体的属性或者方法实现,那么这个事务就是抽象的。

比如 动物 这个事务,没有具体的代指时,他就是一个抽象的。


在Java中,一个没有方法体的方法,我们称之为抽象方法,当一个类中有抽象方法,那么这个类必须是抽象的。

所有  抽象类中不一定有抽象方法,但有抽象方法的类一定是抽象类。

抽象的特点

1.用abstract关键字修饰。

2.抽象类中不一定有抽象方法,但有抽象方法的类一定是抽象类

3.抽象类不能被直接实例化。

                他不是具体的类,但抽象类可以被继承,他有自己的构造方法。

4.抽象类的子类如果也是抽象方法,那么父类的抽象方法可以不重写。

5.抽象类的子类不是抽象类,那么父类的抽象方法必须全部重写。

抽象的实例化

当有具体类的时候,抽象类可以被多态实例化。

抽象类成员的特点

1.成员变量:成员变量可以为变量,常量。

2.成员方法:可以是抽象方法也可以是非抽象方法。

3.构造方法:抽象类有构造方法,因为可以继承。

常见抽象问题

如果一个类中没有抽象方法,是否为抽象类?

当然是,当你不想这个类被直接实例化时就可以采用这种方式。

abstract 和哪些修饰符不能共存?

private  冲突    错误信息: 非法的修饰符组合: abstract和private

final 冲突 错误信息: 非法的修饰符组合: abstract和final

static 冲突 错误信息:非法的修饰符组合: abstract和static

三、接口

接口就是为某一事物额外添加一些功能。

接口的特点

1.用 interface 关键字修饰

2.没有构造方法

3.类去实现接口用 implements 关键字

4.接口不能实例化,但可用多态实例化

5.接口的子类可以是抽象的亦可以是不抽象的,不抽象要重写所有方法。

6.接口可以多继承。

接口成员的特点

1.成员变量:只能是常量,而且他有默认修饰符   public static final

2.成员方法:只能是抽象方法,且有默认修饰符   public abstract

3.构造方法:没有

类与类,类与接口,抽象类与接口,接口和接口

类与类:类与类直接本没有关系,通过继承建立联系,这时类与类之间只能单继承,不能多继承,却可以多层继承

类与接口:接口用interface关键字修饰,接口的方法都是抽象方法,没有构造方法,类实现接口需要implement关键字,同时还要重写接口中的所有的方法。

抽象类与接口:抽象类抽象方法方法体可以为空,接口的方法没有方法体。

接口和接口之间可以继承,也可以多次继承,亦可以多层继承。

接口内方法可以使用的权限修饰符

在JDK1.8以前,Java的接口里面的方法只能是抽象的方法

在JDK1.8,Java接口的方法可以用 default 修饰符和 static 修饰符,目的是解决,当多个类实现接口时,接口内方法改变,导致每个实现类都要重写改变方法的问题,

为接口新增方法时可以使用 default ,不会破坏已经实现类的兼容性。允许接口提供默认方法,减少实现类的工作量。

提供给接口相关的工具或者方法,这些方法可以定义为静态的。

在JDK9开始,接口又可以提供 private ,主要是让 default 修饰的方法调用。

多态的分类

具体类的多态

抽象类的多态

接口的多态

 

方法的参数和返回值

写一个方法时,思考:它的返回值类型

参数类型

类名作为参数(需要传递的是类的实例对象)

抽象类作为参数(需要传递的是, 它的具体要类的实例对象)

接口作为参数(需要传递的是, 它的实现类的实例对象)

返回值

类名作为返回值类型: 返回对应类的对象

抽象类作为返回值类型: 返回抽象类的具体类的对象

接口作为返回值类型: 接口实现类的对象

权限修饰符

权限修饰符        本类     同一个包下(子类和无关类)   不同包子类    不同包的无关类
   
   private         Y             
   
   默认             Y           Y
   
   protected       Y           Y                     Y
   
   public          Y           Y                     Y             Y

常见的修饰特点以及适用场景

修饰符:
      权限修饰符    private  默认的   protected  public
      状态修饰符    static   final
      抽象修饰符    abstract
      

      权限修饰符    默认的    public
      状态修饰符    final
      抽象修饰符    abstract
      (以上public用的最多)
      
成员变量
      权限修饰符    private  默认的   protected  public
      状态修饰符    static   final
       (用的最多的是private)
       
成员方法
      权限修饰符    private  默认的   protected  public
      状态修饰符    static   final
      抽象修饰符    abstract
      (用的最多的public)
      
构造方法
      权限修饰符    private  默认的   protected  public
     (用的最多的public)
     
 组成规则
        组成变量   public static final
        成员方法   public static
                  public abstarct
                  public final      
     

 

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值