• java基础知识--抽象类与接口


    抽象类与接口

    1、Java 抽象类

      1、引言:

      在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,

      这样的类就是抽象类 

      抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。

      由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。

      2、在Java语言中使用abstract class来定义抽象类

     1 /* 文件名 : Employee.java */
     2 public abstract class Employee
     3 {
     4    private String name;
     5    private String address;
     6    private int number;
     7    public Employee(String name, String address, int number)
     8    {
     9       System.out.println("Constructing an Employee");
    10       this.name = name;
    11       this.address = address;
    12       this.number = number;
    13    }
    14    public double computePay()
    15    {
    16      System.out.println("Inside Employee computePay");
    17      return 0.0;
    18    }
    19    public void mailCheck()
    20    {
    21       System.out.println("Mailing a check to " + this.name
    22        + " " + this.address);
    23    }
    24    public String toString()
    25    {
    26       return name + " " + address + " " + number;
    27    }
    28    public String getName()
    29    {
    30       return name;
    31    }
    32    public String getAddress()
    33    {
    34       return address;
    35    }
    36    public void setAddress(String newAddress)
    37    {
    38       address = newAddress;
    39    }
    40    public int getNumber()
    41    {
    42      return number;
    43    }
    44 }

      3、抽象方法   

        抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:

              abstract void fun();

        抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,

        所以不能用抽象类创建对象。

    4、在使用抽象类时需要注意几点:

             1、抽象类不能被实例化,实例化的工作应该交由它的子类来完成,它只需要有一个引用即可。

     

             2、抽象方法必须由子类来进行重写。

     

             3、只要包含一个抽象方法的抽象类,该方法必须要定义成抽象类,不管是否还包含有其他方法。

     

             4、抽象类中可以包含具体的方法,当然也可以不包含抽象方法。

     

             5、子类中的抽象方法不能与父类的抽象方法同名。

     

             6、abstract不能与final并列修饰同一个类。

     

             7、abstract 不能与private、static、final或native并列修饰同一个方法。

      5、抽象类和普通类的主要有三点区别

      1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。

      2)抽象类不能用来创建对象;

      3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

    6、抽象类总结规定  

    1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。

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

    3. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。

    4. 构造方法,类方法(用static修饰的方法)不能声明为抽象方法。

    5. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。

    2、Java 接口

      1、概念   

    接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

    接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。

    除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。

    接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。

        接口特性   

        • 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
        • 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
        • 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。  

      2、接口与类相似点

      • 一个接口可以有多个方法。
      • 接口文件保存在 .java 结尾的文件中,文件名使用接口名。
      • 接口的字节码文件保存在 .class 结尾的文件中。
      • 接口相应的字节码文件必须在与包名称相匹配的目录结构中。  

    3、接口与类的区别  

      • 接口不能用于实例化对象。
      • 接口没有构造方法。
      • 接口中所有的方法必须是抽象方法。
      • 接口不能包含成员变量,除了 static 和 final 变量。
      • 接口不是被类继承了,而是要被类实现。
      • 接口支持多继承。

      4、接口的声明

      接口的声明语法格式如下 

    [可见度] interface 接口名称 [extends 其他的类名] {
            // 声明变量
            // 抽象方法
    }

      示例: 

    1 /* 文件名 : Animal.java */
    2 interface Animal {
    3    public void eat();
    4    public void travel();
    5 }

      5、接口的实现   

    当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。

    类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。

    可以使用这个公式:...implements 接口名称[, 其他接口, 其他接口..., ...] ...

    示例:

     

     1 /* 文件名 : MammalInt.java */
     2 public class MammalInt implements Animal{
     3  
     4    public void eat(){
     5       System.out.println("Mammal eats");
     6    }
     7  
     8    public void travel(){
     9       System.out.println("Mammal travels");
    10    } 
    11  
    12    public int noOfLegs(){
    13       return 0;
    14    }
    15  
    16    public static void main(String args[]){
    17       MammalInt m = new MammalInt();
    18       m.eat();
    19       m.travel();
    20    }
    21 }

     

      结果:Mammal eats   Mammal travels

      

      • 类在实现接口的方法时,不能抛出强制性异常,只能在接口中,或者继承接口的抽象类中抛出该强制性异常。
      • 类在重写方法时要保持一致的方法名,并且应该保持相同或者相兼容的返回值类型。
      • 如果实现接口的类是抽象类,那么就没必要实现该接口的方法。

      在实现接口的时候,也要注意一些规则: 

      • 一个类可以同时实现多个接口。
      • 一个类只能继承一个类,但是能实现多个接口。
      • 一个接口能继承另一个接口,这和类之间的继承比较相似。

      6、接口的继承

        一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。  

     1 // 文件名: Sports.java
     2 public interface Sports
     3 {
     4    public void setHomeTeam(String name);
     5    public void setVisitingTeam(String name);
     6 }
     7  
     8 // 文件名: Football.java
     9 public interface Football extends Sports
    10 {
    11    public void homeTeamScored(int points);
    12    public void visitingTeamScored(int points);
    13    public void endOfQuarter(int quarter);
    14 }
    15  
    16 // 文件名: Hockey.java
    17 public interface Hockey extends Sports
    18 {
    19    public void homeGoalScored();
    20    public void visitingGoalScored();
    21    public void endOfPeriod(int period);
    22    public void overtimePeriod(int ot);
    23 }

      接口的多继承   

    在Java中,类的多继承是不合法,但接口允许多继承,。

    在接口的多继承中extends关键字只需要使用一次,在其后跟着继承接口。

    public interface Hockey extends Sports, Event

    3、抽象类和接口的区别

    1.语法层面上的区别

      

      2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;

      3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;

        4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。

      2.设计层面上的区别

      1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象

      举个简单的例子,飞机和鸟是不同类的事物,但是它们都有一个共性,就是都会飞。那么在设计的时候,可以将飞机设计为一个类Airplane,将鸟设计为一个类Bird,但是不能将 飞行

       这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。此时可以将 飞行 设计为一个接口Fly,包含方法fly( ),然后Airplane和Bird分别根据自己的需要实现Fly

    这个接口。然后至于有不同种类的飞机,比如战斗机、民用飞机等直接继承Airplane即可,对于鸟也是类似的,不同种类的鸟直接继承Bird类即可。从这里可以看出,继承是一个 "是不

    是"的关系,而 接口 实现则是 "有没有"的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否

    具备飞行这个特点),能飞行则可以实现这个接口,不能飞行就不实现这个接口。

      2)设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计而接口是一种行为规范它是一种辐射式设计

      什么是模板式设计?

      最简单例子,大家都用过ppt里面的模板,如果用模板A设计了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A了,如果它们的公共部分需要改动,则只需要改动模板A就可以了,不需

      要重新对ppt B和ppt C进行改动。而辐射式设计,比如某个电梯都装了某种报警器,一旦要更新报警器,就必须全部更新。也就是说对于抽象类,如果需要添加新的方法,可以直接在抽

      象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。

     

     

    参考博客:

      http://www.cnblogs.com/dolphin0520/p/3811437.html

      http://www.runoob.com/java/java-interfaces.html

      http://blog.csdn.net/chenssy/article/details/12858267

    千里路我只陪你一程,从此艳阳风雪我不问!
  • 相关阅读:
    如何垂直居中一个浮动元素?
    微信小程序vant-search获取不到输入的搜索内容踩坑
    关于微信小程序无法使用css3过度属性transition以及微信小程序如何利用api进行画面过度的展示
    Spring Shedule Task之注解实现 (两次启动Schedule Task 的解决方案)
    学习站点记录
    Spring 通过配置文件注入 properties文件
    Liunx下安装jdk
    Mybatis使用generator自动生成映射配置文件信息
    Tomcat容器虚拟路径设置
    Spring init-method和destroy-method 的使用
  • 原文地址:https://www.cnblogs.com/huststl/p/7588176.html
Copyright © 2020-2023  润新知