zoukankan      html  css  js  c++  java
  • Java 抽象类和接口详解

    一.抽象类

    (1)定义

    抽象,就是不够具体
    在人脑中,很多的概念其实也是抽象的,例如动物,水果
    使用了关键词abstract声明的类叫作“抽象类”。

     

    (2)语法体现

    abstract - 抽象的
    可以修饰类也可以修饰方法

    1 抽象类不能创建实例,一般用来做为父类,封装子类共有一些属性和方法
    2 抽象的父类中经常定义一些抽象方法,用来给子类写重写覆盖,这样子类可以体现不同的实现细节,子类必须重写父类中抽象的方法

    除非该子类也是抽象类

    abstract class Animal{
    private String name;
    private int age;
    
    public abstract void sleep();
    
    public void setName(String name){
    this.name = name;
    }
    public String getName(){
    return name;
    }
    
    public void setAge(int age){
    this.age = age;
    }
    public int getAge(){
    return age;
    }
    }

     

     

    (3)更多的语法限制

    1 abstract不能与final连用:abstract目的是让人家继承的,final:目的是不让人家继承的
    2 abstract不能与static连用:abstract修饰的方法是不用实现的抽象方法。static修饰的方法要实现的类方法
    3 如果一个类有一个抽象方法,该类就必须定义成抽象类
    4 子类继承抽象的父类,必须重写父类中的所有抽象方法,除非这个子类也是抽象类
    5 抽象的子类继承抽象父类,那么可以重写父类中的部分抽象方法,或者不重写
    6 抽象类可以继承一个非抽象类
    7 抽象类里可以没有抽象方法

    (4)使用例子

    abstract class Printer{
      public abstract void print(Ticket t);
    }
    
    Printer p = new ?();
    p.print(t);
    
    模板设计模式
      一个模板方法,里面包含多个细节步骤,这些步骤是不知道如何具体实现,给子类实现
    public abstract class Template{
      public final void template(){
         m1();
         m2();
         m3();
         m4();
      }
      public abstract void m1();
      public abstract void m2();
      public abstract void m3();
      public abstract void m4();
    
      
    }
      }
     

     

    (5)抽象类意义

    1 抽象的,高层的类能够代表更宽的范围,不容易出错
    2 抽象类可以在后期的需求变化用不同的子类来代替,这样使我们的程序更加灵活

    class 派叫号系统{
    HPPrinter p = new HPPrinter()
    p.print(t);
    }
    
    class 派叫号系统2{
    BrotherPrinter p = new BrotherPrinter()
    p.print(t);
    }
    
    class 派叫号系统3{
    XxxxPrinter p = new XxxxPrinter()
    p.print(t);
    }
    
    
    class 派叫号系统{
    Printer p = new ???();
    p.print(t);
    }

     

    二.接口

    (1)定义与语法

    为什么使用接口?
    例子:要求实现防盗门的功能
    分析:门有“开”和“关”的功能,锁有“上锁”和“开锁”的功能。
    将门和锁分别定义为抽象类
    防盗门可以继承门的同时又继承锁吗?如何实现多继承??
    如何解决这个问题呢?
    1.将门定义为抽象类,锁定义为接口
    2.防盗门继承门,实现锁的接口

    因为java不支持多继承,只能继承一个,所以继承名额是宝贵的,有了接口,就能实现接口,就不用占用宝贵的继承名额了

    语法:
    public interface MyInterface {
    // 所有方法都是:public abstract
    public void foo(); //其他方法
    }
    必须知道的接口特性:
    接口不可以被实例化
    实现类必须实现接口的所有方法,除非实现类是抽象类。
    实现类可以实现多个接口
    接口中的变量都是静态常量

    (2)语法限制

    1 实现一个接口就必须实现这个接口所有方法,除非它是一个抽象类
    2 一个类是不能继承多个类(单继承),可以避免很多问题,接口可以继承多个接口
    3 类不能继承接口,接口也不能继承类(类继承父类。)
    4 一个类可实现多个接口
    5 实现接口的方法,访问控制符不能更窄。

    (3)使用例子

    1.接口是一种约定:大小,针数量。
    生活中,我们使用的两相电源插座,规定了:两个接头间的额定电压两个接头间的距离接头的形状
    程序设计时面向接口的约定而不考虑具体实现
    2.接口表示一种能力



    接口表示一种能力。

     

     


    需求说明:原始的手机,可以发短信,通电话。随着发展,手机增加了功能:音频、视频播放、拍照、上网。

     

     


    接口是一种约定:

     

    墨盒和纸张的规格是一种约定 打印机需要遵守这些约定
    用面向接口编程的方式开发制定墨盒、纸张的约定或标准
    打印机厂商使用墨盒、纸张的标准开发打印机
    其他厂商按照墨盒、纸张的标准生产墨盒、纸张
    实现步骤:
    定义墨盒接口InkBox
    定义纸张接口Paper
    定义打印机类
    实现墨盒接口
    实现纸张接口

    (4)接口回调

    回头调用
    一个类依赖接口,这个类可以提前写好,过了很久之后 ,有人需要让这个类去运行,他做为后来者,只需提供一个实现了该接口的类,就可以让这个类去运行。这就是接口回调。

     

     

    (5)抽象类和接口的区别(面试)

    很多时候我们都将抽象类和接口混淆,如果分不出定义抽象类和接口的时候,最好直接定义为接口,为了保留有限而且宝贵的java单继承天性。

    1 语法区别
    1)抽象类可以包含具体方法,但接口中所有的方法都必须抽象的
    2)一个类只继承一个抽象类 ,但是可以实现多个接口
    3)抽象类实现接口,反之,接口不能继承抽象类,接口可以继承多个接口。
    4)抽象类定义的成员变量就是普通的实例变量,接口中定义的成员变量会变成静态常量
    5) 抽象类可以有具体的方法,这些具体的方法里面就可以写一些共性代码,这样子类就可以继承下来,避免重复代码,有的时候会用抽象类来代替接口

    2 语义区别
    is a 继承关系
    has a 实现关系

    interface Alert
    报警
    abstract Door
    打开
    关闭
    AlertDoor extends Door implements Alert
    报警
    打开
    关闭

    接口 Fighter{
    fight()
    }
    学生 implements Fighter{}
    study()
    fight()
    黑社会分子 implements Fighter{}
    fight()

    接口 Flyable{
    fly()
    }
    飞机 implements Flyable{
    fly()
    }
    鸟 implements Flyable{
    fly()
    }

    超人 implements Flyable{
    fly()
    }

    连接数据库
    接口 Driver{
    connection()
    }

    Mysql 驱动 implements Driver{
    connection()
    }

    Oracle 驱动 implements Driver{
    connection()
    }

    Sql Server 驱动 implements Driver{
    connection()
    }


    (6)广义接口定义

    1 代表一个类,一个方法,或者java中的interface
    2 通信协议
    3 数据接口(比如json格式的数据接口)
    4 用户界面(用户接口UI = User Interface) UI

     

     

  • 相关阅读:
    4星|《态度》:吴军博士写给读高中和大学的女儿们的信
    2星|宇见《洞察力:让营销从此直指人心》:营销讲师自创的理论,逻辑较差,洞察力不用提
    1星|《社群X平台》:没有实际工作经验的职业写手拼凑而成
    3星|《一课经济学》:70年前的经济学思想普及读物,现在看还不过时
    3.5星|《戴维斯王朝》:业绩媲美巴菲特的投资人家族的故事
    3.5星|《行为设计学:零成本改变》:明确的、可操作的、短期的、可以引起情感共鸣的目标,更有助于个人或组织做出改变
    1星|《讲法:从说教到赋能》:用伪科学概念说理,对建构主义的解释与理解比较牵强
    2星|《谁站在马云背后》:总裁律师的职责、素养、趋势。信息浓度较低,案例偏老旧肤浅
    2星|简七《巴比伦富翁新解》:浅显的理财原则,目测作者长于理财培训而不是理财实战
    使用 Visual Studio 部署 .NET Core 应用 ——.Net Core 部署到Ubuntu 16.04
  • 原文地址:https://www.cnblogs.com/Transkai/p/10351099.html
Copyright © 2011-2022 走看看