抽象类 接口 多态

抽象类

我们思考一个问题,虽然我说过汽车类,但是你知道我说的是什么汽车吗?
只有看到了具体的汽车,我们才会明白,这是什么汽车。
也就是说,汽车本身并不是一个具体的,而是一个抽象的事物。只有真正的宝马车,才是具体的汽车。
同理,我们也可以推想,不同的汽车run方法的实现应该是不一样的,
所以,我们没必要在汽车类中的run方法给出具体实现,仅仅给出一个声明即可。
在Java中,如果一个没有方法体,没有实现的方法定义为抽象方法,
一个类中一旦出现抽象方法,该类一定是一个抽象类


抽象类的特点:

1.抽象类使用 abstract 关键字修饰
2.有一个抽象方法的类一定是抽象类
3.一个抽象类可以没有抽象方法
4.没有抽象方法的抽象类有意义, 防止外界创建对象

  •  防止外界创建对象的方式:
     	a.构造方法私有
     	b.抽象类
     	c.接口
     	d.内部类
    

5.抽象类不能够实例化
6.如果我想要"实例化"抽象类,怎么做 --> 利用多态
7.抽象类也可以创建匿名内部类对象

  •  匿名内部类的格式:
     new 类名() {
     		重写方法
     	}
    

8.抽象类的子类特点:
        a.如果一个子类想要继承抽象类,就必须实现抽象类中的所有的抽象方法
       b.如果一个子类不想要实现抽象类中的抽象方法,子类必须升级为抽象类
9.抽象类和普通类的区别:

  •  抽象类中是否有 常量 成员变量 成员方法 构造方法 静态方法?
    
  •  有的话又有什么意义呢?
     成员变量 成员方法 构造方法 给子类用
     常量  静态方法 直接类名方法
     构造方法: 帮助子类初始化父类继承下去的成员
    

10.private final native static protected public 哪些可以修饰抽象方法,哪些不可以,说出为什么?
       private final native和 抽象方法冲突
       static 和 抽象方法无意义
       protected public 和 抽象方法可以共存
11.抽象类的本质就是一个彻头彻尾的服务类,所有的成员都给子类使用,自己不能实例化,燃烧自己,服务子类
抽象类可以是一个模板


接口

在生活中
1.接口是一种规范
2.接口是灵活的
3.接口是可以扩展功能

从宏观上理解: 接口开发
应用: 后台接口开发, 前端界面(UI)

从微观理解: 类似于方法 Java里面接口 interface

Java当中的接口

接口是一种比抽象类还要抽象类
接口的格式:

  • interface 接口名 {
    常量 和 抽象方法的集合
    注意: 在JDK1.8之后还可以有 静态方法和默认方法
    }

  • 接口的实现类格式:
    class 接口名Impl implements 接口名 {
    // 实现接口中所有的抽象方法
    }

  • 接口的特点:
    1.接口使用 interface关键字修饰
    2.接口是常量和抽象方法的集合,在JDK1.8之后还可以有 静态方法和默认方法
    3.接口中的常量默认省略 public static final
    接口中的方法默认省略 public abstract
    4.接口不能够实例化
    5.如果想要"实例化"一个接口,必须使用多态【接口多态】
    6.接口的子类特点:
            a.如果一个类想要实现一个接口,那么就必须实现该接口中所有的抽象方法
            b.如果一个类不想要实现接口,那么该类升级为接口

接口的特点汇总:

1.接口使用 interface关键字修饰
2.接口是常量和抽象方法的集合,在JDK1.8之后还可以有 静态方法和默认方法
3.接口中的常量默认省略 public static final
        接口中的方法默认省略 public abstract
4.接口不能够实例化
5.如果想要"实例化"一个接口,必须使用多态【接口多态】
6.接口的子类特点:
        a.如果一个类想要实现一个接口,那么就必须实现该接口中所有的抽象方法
        b.如果一个类不想要实现接口,那么该类升级为接口
7.接口是一种规范
8.接口是可以扩展功能
9.接口是灵活的
10.接口和抽象类的区别
       父类是普通类的是模板,父类是抽象类是部分模板,部分规范,父类是接口的时候,就是完全规范
11.
类和类: 单继承 不能多继承,不能多实现
类和接口: 多实现, 不能够多继承
接口和接口: 多继承, 不能多实现
12.什么时候使用接口? 什么时候使用继承?
       当抽取多个共性代码或者设计复杂类的时候使用继承,其他一律接口
13.面向接口编程
       集合框架 Collection List

面向对象编程汇总

  • 类的组成

  • 包的声明; package

  • 导包; import

[访问权限修饰符] class 类名 extends 父类 implements 接口1, 接口2,…, 接口n{
任何一个类都有一个父类 Object类

  •  封装:
     1.给成员添加 访问权限修饰符
     	2.提供get / set 方法
     	3.给属性的读写添加数据校验
    
  •  继承: 继承是对一批类的抽象,一般用来抽取共性代码
    
  •  多态: 父类引用指向子类对象
     	继承多态 
     	接口多态
    
  •  组合
    
  •  抽象类和接口的区别
    
  •  常量  字面值常量 自定义常量 
    
  •  成员变量  this super
    
  •  类变量 static
    
  •  构造方法
     无参构造方法
     	全参构造方法
     	构造方法重载
    
  •  成员方法
    
  •  普通方法
    
  •  	get/set方法
    
  •  	方法重载
    
  •  	方法重写
    
  •  静态方法 static
    
  •  本地方法 native
    
  •  内部类
     	1.成员内部类   private 
     	2.局部内部类
     	3.静态内部类
     	4.匿名内部类
     内部抽象类
    
  •  内部接口
    

多态的必要条件:
1.必须存在继承关系
2.必须存在方法重写
3.父类引用指向子类对象

多态的概述:
生活上: 同一个动作在不同的环境下体现出来的不同的结果
代码中: 父类引用指向子类对象

多态访问成员的特点

成员变量: 编译时期看左边类型,运行时期看左边类型
成员方法: 编译时期看左边类型,运行时期看右边类型
构造方法: 帮助子类初始化父类继承过来的成员
静态方法: 编译时期看左边类型,运行时期看左边类型

多态的缺点以及解决办法

缺点: 通过多态的父类引用无法访问子类所特有的方法

  • 向上转型(自动转换)
    格式:<父类型> <引用变量名> = new <子类型>();
    特点:
    子类转为父类 父类的引用指向子类对象。自动进行类型转换
    此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法
    此时通过父类引用变量无法调用子类特有的属性和方法
    向下转型(强制转换)
    格式:<子类型> <引用变量名> = (<子类型> )<父类型的引用变量>;
    特点:
    父类转为子类,父类引用转为子类对象。理解为强制类型转换
    在向下转型的过程中,如果没有转换为真实子类类型,会出现类型转换异常

    ClassCastException
    异常名称: 类型转换异常
    产生原因: 在向下转型的过程中没有转换成真实的类型
    解决办法: 对父类的所有子类做逐一类型判断

  • instanceof关键字
    格式: 左边对象 instanceof 右边类
    作用: 判断左边对象是否属于右边类的实例,是返回true,不是返回false

目前我们知道使用向下转型 + instanceof关键字能够解决多态的缺点
但是我们清楚 如果需要对父类的所有子类做逐一判断,可能存在安全隐患或者违反开闭原则
但是还有一个Object类,该类有无数个子类,所以如果父类引用是Object,那么安全隐患永远存在
后期考虑使用泛型改进

你可能感兴趣的:(java基础)