Java 笔记-抽象类,接口

时光怂恿深爱的人放手 提交于 2020-03-01 19:18:56
一.什么是抽象类
  1. 简单理解的来说就是不够具体的类,具体的反义词—抽象.
  2. 比如说一个图形,这就不够具体,一个图形可以具体的细分为三角形,圆形,长方形等等,三角形又可以更加具体,等腰三角形,等边三角形等等 .而抽象类就是将明显具有自己独特特征的具体类模糊化,将大家都有的共同特征抽象出来,比如说医生类,护士类,士兵类,可以通通抽象为—人类.他们都拥有人类的特征,比如说吃饭,睡觉,娱乐之类的,这些执行的方法都是相似的代码,用抽象类抽象出来,再通过子类继承实现就可以大大减少代码量(偷懒+_+).
  3. 抽象类也是普通类前加上了abstarct关键字,同样,一个普通方法前加上了这个关键字也就成为了抽象方法.

二.如何使用抽象类
  1. 不能直接创建(new)抽象类对象
  2. 必须用一个子类来继承抽象类
  3. 子类必须覆盖重写抽象父类中的所有抽象方法,否则会编译报错,除非该子类也是抽象类
    覆盖重写(实现):子类去掉抽象方法的abstract关键字,然后然后方法体大括号
  4. 创建子类进行使用

注意:

  1. 抽象类中,可以有构造方法(有默认的super()),是供子类创建对象时,初始化父类成员使用的
  2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类

三.接口

1. 什么是接口
接口就像是一种公共规范标准,如同国标,众多工厂其实互相不认识,不联系,但造出来的东西就是能够一起使用.比如也像一个USB接口,U盘,充电宝,随身小风扇都有这个借口,U盘可以插在苹果电脑上,也可以插在DELL电脑上,因为大家共同遵守着一种规范标准.

接口是一种引用数据类型,最重要的内容就是其中的:抽象方法。
如何定义一个接口的格式:

public interface 接口名称 
{
    // 接口内容
}

注意:换成了关键字interface之后,编译生成的字节码文件仍然是:.java --> .class。

2. 如何使用接口

如果是Java 7,那么接口中可以包含的内容有:

  1. 常量
  2. 抽象方法

如果是Java 8,还可以额外包含有:

  1. 默认方法
  2. 静态方法

如果是Java 9,还可以额外包含有:

  1. 私有方法

接口使用步骤:

  1. 接口不能直接使用,必须有一个“实现类”来“实现”该接口。
    格式:
public class 实现类名称 implements 接口名称
 {
    // ...
}
  1. 接口的实现类必须覆盖重写(实现)接口中所有的抽象方法。
    实现:去掉abstract关键字,加上方法体大括号。
  2. 创建实现类的对象,进行使用。

接口中的常量
注意:

  1. 接口当中的常量,可以省略 public static final, 不写也默认是这样
  2. 接口当中的常量必须进行复制,不能不赋值
  3. 接口中常量使用完全大写字母,用下划线进行分割(推荐命名规则

接口中的抽象方法
注意

  • 如果实现类并没有覆盖重写接口中所有的抽象方法,那么这个实现类自己就必须是抽象类。

在任何Java版本中,接口都能定义抽象方法
格式:
public abstract 返回值类型 方法名称(参数列表)

注意:

  1. 接口当中的抽象方法,修饰符必须是两个固定的关键字: public abstract
  2. 这两个关键字修饰符,可以选择性省略
  3. 方法的三要素:返回值类型,方法名称,参数列表 可以根据业务情况随意定义
  4. 如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要覆盖重写一次即可。
  5. 如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类就必须是一个抽象类。

接口中的默认方法
从Java 8开始,接口里允许定义默认方法。
格式:

public default 返回值类型 方法名称(参数列表) 
{
    方法体
}

接口当中的默认方法,可以解决接口升级的问题

public interface MyInterfaceDefault 
{

    // 抽象方法
    public abstract void methodAbs();

    // 新添加了一个抽象方法
   // public abstract void methodAbs2();

    // 新添加的方法,改成默认方法
    public default void methodDefault() 
	{
        System.out.println("这是新添加的默认方法");
    }

}

注意

  1. 如果实现类所实现的多个接口当中,存在重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写。
  2. 一个类如果直接父类当中的方法,和接口当中的默认方法产生了冲突,优先用父类当中的方法

接口中的静态方法
接口当中定义静态方法
格式:
public static 返回值类型 方法名称(参数列表){}

注意:

  1. 不能通过接口实现类的对象来调用接口当中的静态方法
    正确用法:通过接口名称,直接调用其中的静态方法

  2. 接口是没有静态代码块或者构造方法的。

  3. 一个类的直接父类是唯一的,但是一个类可以同时实现多个接口。
    格式:

public class MyInterfaceImpl implements MyInterfaceA, MyInterfaceB
 {
    // 覆盖重写所有抽象方法
}

格式:
接口名称.静态方法名(参数);

public interface MyInterfaceAbstract //接口
{
   public static final int num = 10;//
   //这是一个抽象方法
   public abstract void method1();
   //下面的都是抽象方法
   public  void method2();

   abstract void method3();

   void method4();


   public default void method05()
   {
       System.out.println("我是在接口里新添加的默认方法");
   }
   public static void staticMethod()
   {
       System.out.println("我是接口里的静态方法");
   }
}
public class MyInterfaceAbstractImpl implements MyInterfaceAbstract
{    //用一个实现类继承接口

    @Override
    public void method1()
    {
        System.out.println("这是第一个抽象方法");
    }

    @Override
    public void method2()
    {
        System.out.println("这是第2个抽象方法");
    }

    @Override
    public void method3()
    {
        System.out.println("这是第3个抽象方法");
    }

    @Override
    public void method4()
    {
        System.out.println("这是第4个抽象方法");
    }


}
public static void main(String[] args) //主方法
    {
        MyInterfaceAbstractImpl im = new MyInterfaceAbstractImpl();
        im.method1();
        im.method2();
        im.method05();//接口里新添加的默认方法
        im.method3();
        //通过接口名称来调用静态方法
        MyInterfaceAbstract.staticMethod();
    }

在这里插入图片描述


接口中的私有方法

  1. 普通私有方法,解决多个默认方法之间重复的代码问题
    格式:
    private 返回值类型 方法名称(参数列表)
  2. 静态私有方法 解决多个静态方法之间重复代码的问题
    private static 返回值类型 方法名称(参数列表)

四.接口小结

接口内容小结:
在Java 9+版本中,接口的内容可以有:

  1. 成员变量其实是常量,格式:
    public static final 数据类型 常量名称 = 数据值;
    注意:
    常量必须进行赋值,而且一旦赋值不能改变。
    常量名称完全大写,用下划线进行分隔。

  2. 接口中最重要的就是抽象方法,格式:
    public abstract 返回值类型 方法名称(参数列表);
    注意:
    实现类必须覆盖重写接口所有的抽象方法,除非实现类是抽象类。

  3. 从Java 8开始,接口里允许定义默认方法,格式:
    public default 返回值类型 方法名称(参数列表) { 方法体 }
    注意:
    默认方法也可以被覆盖重写

  4. 从Java 8开始,接口里允许定义静态方法,格式:
    public static 返回值类型 方法名称(参数列表) { 方法体 }
    注意:
    应该通过接口名称进行调用,不能通过实现类对象调用接口静态方法

  5. 从Java 9开始,接口里允许定义私有方法,格式:
    普通私有方法:private 返回值类型 方法名称(参数列表) { 方法体 }
    静态私有方法:private static 返回值类型 方法名称(参数列表) { 方法体 }
    注意:
    private的方法只有接口自己才能调用,不能被实现类或别人使用。

  6. 类与类之间是单继承的。直接父类只有一个。

  7. 类与接口之间是多实现的。一个类可以实现多个接口。

  8. 接口与接口之间是多继承的。

  9. 多个父接口当中的抽象方法如果重复,没关系。

  10. 多个父接口当中的默认方法如果重复,那么子接口必须进行默认方法的覆盖重写,(要带着default关键字)

抽象类与接口区别图

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!