聊聊JAVA抽象类与接口

本文参照教科书《Java语言程序设计与数据结构(第11版)》以及网上资料进行编写。
参考网址:Java 抽象类 | 菜鸟教程 (runoob.com)

文章目录

  • 前言
  • 一、抽象类
  • 二、接口
  • 三、抽象类和接口的区别
  • 总结

前言

       本文主要讲解了java的抽象类和接口相关知识点。


一、抽象类

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

  • Java中用abstract class定义抽象类,如下实例:
    public abstract class Employee
    {
       private String name;
       private String address;
       private int number;
       public Employee(String name, String address, int number)
       {
          System.out.println("Constructing an Employee");
          this.name = name;
          this.address = address;
          this.number = number;
       }
       public double computePay()
       {
         System.out.println("Inside Employee computePay");
         return 0.0;
       }
       public void mailCheck()
       {
          System.out.println("Mailing a check to " + this.name
           + " " + this.address);
       }
       public String toString()
       {
          return name + " " + address + " " + number;
       }
       public String getName()
       {
          return name;
       }
       public String getAddress()
       {
          return address;
       }
       public void setAddress(String newAddress)
       {
          address = newAddress;
       }
       public int getNumber()
       {
         return number;
       }
    }
    

    2.抽象方法

           如果你想设计这样一个类,该类包含一个特别的成员方法,该方法的具体实现由它的子类确定,那么你可以在父类中声明该方法为抽象方法。

          Abstract 关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。

          抽象方法没有定义,方法名后面直接跟一个【分号】,而不是花括号。

    public abstract class Employee
    {
       private String name;
       private String address;
       private int number;
       
       public abstract double computePay();
       
       //其余代码
    }

    声明抽象方法会造成以下两个结果:

  • 如果一个类包含抽象方法,那么该类必须是抽象类。
  • 任何子类必须重写父类的抽象方法,或者声明自身为抽象类。

3.抽象类的相关说明
(1)包含抽象方法的类会自动变成抽象类,必须用abstract关键字,如果派生类没有重写抽象方法,编译器会报错。抽象方法用来被确保派生类会实现这个方法。
(2)抽象方法不能包含在非抽象类中。如果抽象父类的子类不能实现所有的抽象方法,那么子类也必须定义为抽象的。抽象方法是非静态的。
(3)抽象类不能使用new操作符来初始化。(可构造这个方法)
(4)包含抽象方法的类必须是抽象的,不能实例化。
(5)子类可以重写父类的方法并将它定义为抽象的。
(6)即使子类的父类是具体的,这个子类也可以是抽象的
(7)不能使用new操作符从一个抽象类创建一个实例,但是抽象类可以用作一种数据类型。
下面语句创建一个元素是GeometricObject类型的数组是正确的:

GeometricObject[] objects = new GeometricObject[10];

(8)然后可以创建一个GeometricObject的实例,并将它的引用赋值给数组,如下所示:

objects[0]=new Circles();

二、接口

1.接口的定义:

       接口是一种与类相似的结构,用于为对象定义共同的操作。
       类和接口之间的关系成为接口继承,因为接口继承和类继承本质上是相同的,所以我们将它们都建成为继承。

       为了区分接口和类,Java采用下面的语法来定义接口:

modifier interface InterfaceName{
   /**Constant declarations*/
  /**Abstract method signatures*/
}

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

3.接口的举例:

public class MammalInt implements Animal{
 
   public void eat(){
      System.out.println("Mammal eats");
   }
 
   public void travel(){
      System.out.println("Mammal travels");
   } 
 
   public int noOfLegs(){
      return 0;
   }
 
   public static void main(String args[]){
      MammalInt m = new MammalInt();
      m.eat();
      m.travel();
   }
}

4.重写接口中声明的方法时,需要注意以下规则:

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

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

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

三、抽象类和接口的区别

  • 1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
  • 2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
  • 3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
  • 4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。


总结

       以上就是本文的所有内容,感谢观看。

你可能感兴趣的:(java,抽象类,接口)