Java接口和抽象类是什么,有什么区别

抽象(abstract)和接口(interface)在Java中都是关键字,也就说明他们足够重要,而抽象类和接口为我们面向对象编程提供了非常大的帮助。下面我们就一起来回顾这基础知识。

  • 抽象类

    • 在构建某些未实现方法的类时,你可能会第一个想到接口,但是抽象类也是实现这个目的一种重要而必要的工具。

    • 创建抽象类需要用到abstract关键字来修饰类,我们希望通过这个通用的类操作一系类方法,如果没有具体的内容,这个抽象类的意义只有一个,就是不让其他类实例化这个抽象类的对象,只能实例化它的子类对象;要达到操控,Java给我们提供了抽象方法的机制,抽象方法也是使用abstract关键字来修饰,包含抽象方法的类就叫做抽象类

    • 抽象类特点

        1. 抽象类和抽象方法必须用abstract关键字修饰
        1. 抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者接口
        1. 抽象类不能实例化,也就是说不能new出来,抽象类必须由子类实例化,这其实也就是多态的一种,抽象类多态(为什么抽象类不能实例化? 如果抽象类实例化,实例化的抽象类对象意思就可以调用抽象类的抽象方法,但是抽象方法是没有具体实现的,也就没有任何意义,所以抽象类不能实例化)
        1. 抽象类的子类要么是抽象类(实例中的Car类),要么就重写抽象类中的抽象方法(实例中的Jetta类)
        1. 一个类只能继承一个抽象类,抽象类也可以继承抽象类(实例中的SuperCar 类)
    • 抽象类成员特点:

        1. 成员既可以是常量也可以是变量,但是abstract不能修饰成员变量,变量的值是不固定的,无法抽象
        1. 抽象类也有构造方法,他的意义在于子类可以访问父类的初始化数据(实例中Jetta构造方法 super()调用了抽象父类构造方法)
        1. 成员方法既可以抽象的,也可以是非抽象的,抽象方法一般是强制要求子类去实现的方法,非抽象方法一般是重复的代码,可以提高代码复用性
        1. abstract关键字不能与static关键字(原理和抽象类不能实例化其实是一个道理,staticx修饰的抽象方法不需要实例化可以直接调用,这显然是没有意义的)、final关键字(final修饰的方法子类不能重写,abstract修饰的方法子类强制重写)、private关键同时出现(private修饰的方法子类不能访问
    • 实例

      /**
       * @Author: mao.qitian
       * @Date: 2018/8/11 0011 16:25
       * @Description: 汽车抽象类
       */
      public abstract class Car {
      
      public Car(){
          System.out.println("抽象类的构造方法被调用");
      }
      
      public void driver(){
          System.out.println("所有汽车都能驾驶");
      }
      //汽车的速度
      public abstract void speed();
      } 
      
      /**
       * @Author: mao.qitian@gxxmt.com
       * @Date: 2018/8/11 0011 16:29
       * @Description: 捷达
       */
       public class Jetta extends Car{
       
       public Jetta(){
          super();
       }
       
       @Override
       public void speed() {
          System.out.println("开完兰博基尼再开捷达速度上无法适应");
         }
       }
       
       
      /**
       * @Author: mao.qitian
       * @Date: 2018/8/11 0011 22:39
       * @Description: 超跑
       */
      public abstract class SuperCar extends Car {
      //超跑的价格
      public abstract void expensive ();
      }
      
      /**
       * @Author: mao.qitian
       * @Date: 2018/8/11 0011 16:27
       * @Description: 兰博基尼
       */ 
      public class Lamborghini extends SuperCar {
      @Override
      public void speed() {
          System.out.println("兰博基尼速度两秒破百");
      }
      
      @Override
      public void expensive() {
        }
      } 
      
  • 接口(interface)

    • 接口使抽象的更向前迈进了一步,interface关键字修饰方法产生的是完全抽象的类,它允许创建者定义方法名,传参和返回类型,但是它没有任何方法体,只提供了形式(规则),而未提供任何具体实现。

    • 接口的特点

        1. 接口使用interface关键字代替class修饰类,
        1. 类实现接口用implement表示
        1. 和抽象类一样,接口也不能实例化,只能由实现了接口的类来进行实例化
        1. 接口的子类可以是抽象类,也可以是具体类,具体类要重写接口的抽象方法
    • 接口成员特点

        1. 接口中定义的变量都是常量,默认修饰符为 public static final
        1. 接口没有构造方法
        /**
         * @Author: mao.qitian
         * @Date: 2018/8/12 0012 0:22
         * @Description:
         */
        public interface A {
          public  void b();
         }
        
         class C implements A{
          public C(){
          super();//调用的是Objetc类的构造方法,方法默认继承Objetc类
          }
         @Override
          public void b() {
          }
         }
        
        1. 接口中的成员方法只能是抽象方法,默认修饰符为 public abstract
        1. 接口中的所以成员方法和变量都是公共的(public)
    • 接口的应用

      • 策略模式:定义一系列算法,把每一个算法封装起来,并且使他们可以相互替换。策略模式使得算法可独立于使用它的客户端而独立变化

      • 三个角色

        • 上下文角色(Context):操作我们制定策略的上下文环境,使用策略的通用调用
        • 抽象策略角色(Stragety):策略,算法的抽象,通常是一个接口
        • 策略的实现角色(ConcreteStragety):实现抽象的策略接口,具体实现这个策略
        • 实例
        实现学校教师的奖金发放,教师有属性:编号、姓名,教学总工作量,奖金
        奖金的计算方法为:
                        x*30   (当职称为教授时)
               y=       x*25   (当职称为副教授时)
                        x*20    (当职称为讲师时)
        
        public interface Function {                             
        //接口定义抽象方法 (Stragety)
        public double Money(double x);
        }
        
        public class A implements Function  {
          //教授奖金计算
          public double Money(double x) {
          return x*30;
          
         }
        
         public class B implements Function {
         //副教授奖金计算
         public double Money(double x) {
          return x*25;
          }
         }
        
        public class C implements Function {
          //讲师奖金计算
          public double Money(double x) {
          return x*20;
          }
        }
        
        public class myMoney {
         //上下文角色
         Function s;
         double M;//工时
             String name;//教师姓名
             String type;//教师职称
             int number;//教师编号
        
         public void S(double X,String N,int Num,String Type){
         this.M=X;
         this.name=N;
         this.number=Num;
         this.type=Type;
         }
         //奖金计算方式
         public double getMoney(){
         if(type.equals("教授")) s=new A();
         if(type.equals("副教授")) s=new B();
         if(type.equals("讲师")) s=new C();
         return s.Money(M);
           }
         }
             //使用
         myMoney f=new myMoney();
                   Scanner sc=new Scanner(System.in);
                   System.out.println("请输入职位:");
                   String Type=sc.next();
                   System.out.println("请输入姓名:");
                   String N=sc.next();
                   System.out.println("请输入编号:");
                   int Num=sc.nextInt();
                   System.out.println("请输入工时:");
                   double X=sc.nextDouble();
                   f.S(X, N, Num, Type);
                   System.out.println(N+奖金为"+f.getMoney());
        
  • 类与类,类与接口,接口与接口之间的关系

    • 类与类之间,一个类只能继承一个类,但是类可以多层继承
    • 类与接口则是实现关系,一个类可以继承一个接口,也可以继承多个接口,也可以继承一个类的同时实现多个接口
    • 接口与接口之间是继承关系,一个接口可以继承另一个接口,也可以继承多个接口
/**
 * @Author: mao.qitian
 * @Date: 2018/8/12 0012 0:22
 * @Description:
 */
 public interface A {
  public  void a();
  }
 interface B {
  public  void b();
  }
 interface C extends B,A{ //接口与接口之间继承,多继承
  public  void c();
  }
  class D implements A,B,C{
  @Override
  public void a() { }
  @Override
  public void b() { }
  @Override
  public void c() { }
  }
  • 抽象类和接口的区别

成员区别 继承关系区别 设计理念区别
抽象类 成员变量可以是常量,也可以是变量,有构造方法,成员方法可以是抽象的也可以是非抽象的 单继承,多层继承 被继承的体现是“is a”的关系,抽象类中定义的是该继承体系的共性功能
接口 成员变量只能是常量,没有构造方法,成员方法只能是抽象的 实现,可以实现多个接口 被继承的体现是“like a”的关系,接口中定义的是该继承体现的扩展功能

最后

还是那句话,好记性不如烂笔头,通过这一篇文章,再次巩固了基础知识。如果文章中有写得不对的地方,请给我留言指出,大家一起学习进步。

  • 参考资料:

    • 《Android进阶之光》
    • 《Java编程思想》(第四版)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,612评论 18 399
  • 抽象类 在继承的层次结构中,每个新子类都使类变得越来越明确具体。如果从一个子类追溯到父类,类就会变得更通用和抽象。...
    Steven1997阅读 1,374评论 0 5
  • 这是怎么啦? 难道是铠甲搞鬼? 我靠,不会是强迫我学习吧? …… 张卓越想越有这种可能,因为,他现在根本就无法遏制...
    嗨小睿阅读 287评论 0 0
  • 有时候 真的很想和她 掏心掏肺地讲述那些 因为想她而失眠的夜 因为念她而醉酒的街 因为爱她而哭泣的泪 可每次话到嘴...
    纳西奇麒阅读 109评论 0 0
  • 樗散待逢春,天机倚四轮。江湖一失足,蝶我两蒙尘。 对酒思高咏,临风忆故人。不堪翘首际,尼父困于陈。
    抱朴堂主阅读 215评论 0 0