Java抽象类和接口

一、抽象类

    1.什么是抽象类

       在了解抽象类是什么之前,我们应该先了解抽象方法。抽象方法是一种特殊的方法,它在父类中无法实现,但可以在具体子类的实例中实现,方法头中使用abstract修饰符表示。父类中定义了这些方法后,这个父类就成为了一个抽象类。在类的头部也使用abstract修饰符表示。

public abstract class Circle // 抽象类定义
public abstract double getArea(); //抽象方法定义

抽象类和常规类很像,但是不能用 new 操作符创建它的实例。抽象类的构造方法定义为protected或者public,因为它只被子类使用。

    2.抽象类好处

       可以隐藏具体的细节信息,所有的子类使用的都是相同的方法原型,其中包含了调用该方法时需要了解的全部信息;强迫子类完成指定的行为,规定所有子类的“标准”行为。

       下面我们看一个例子来更直观的感受其中的好处:

public class TestGeometricObject {
    public static void main(String[] args) {
        GeometricObject geoObject1 = new Circle(5);
        GeometricObject geoObject2 = new Rectangle(5,3); // 创建新的圆和矩形
        
        System.ouy,println("the two objects have the same area? " +
            equalArea(geoObject1,geoObject2)); //如果GeometricObject里没有定义getArea()方法,就不能在该程序中定义equalArea方法来计算两个面积是否相同

        displayGeometricObject(geoObject1); 
        displayGeometricObject(geoObject2);
     //根据调用该方法的实际对象的类型来动态决定调用哪一个方法
   }
}

  3.关于抽象类的几点说明

(1)抽象类不能被实例化,不能使用new 操作符初始化,但可以定义它的构造方法,并在它的子类的构造方法中可以调用。

(2)抽象类可以用作一种数据类型,如

GeometricObject[] objects = new GeometricObject[10];
//然后再创建一个实例
objects[0] = new Circle;

(3)抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。

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

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

 二、接口

    1.什么是接口

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

modifier interface 接口名称{
         // 声明变量
           ......
        // 抽象方法
}

       接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。

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

    2.接口与类

(1)相似点:一个接口可以有多个方法,接口相应的字节码文件必须在与包名称相匹配的目录结构中。

(2)区别:接口没有构造方法,不能用于实例化对象,接口中所有方法必须是抽象方法(Java 8 之后 接口中可以使用 default 关键字修饰的非抽象方法),接口不能包含除了 static final 变量以外的成员变量。所有的类共享同一个根类 Object,但接口没有共同的根,

 (3)接口不是被类继承了,而是要被类实现,接口支持多继承(利用关键字 extends

看一个图来理解类与接口之间的关系

图中,Class1 实现了接口 Interface1;Interface1 继承了接口 Interface1_1 和  Interface1_2。Class2 继承 Class1 并实现接口 Interface2_1 和 Interface2_2。

假设 a 是Class2 的一个实例,那么 a 也是 Object、Class1、Interface1_1、Interface1_2、 Interface2_1 和 Interface2_2 的实例。

   3.实现接口

      当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。类使用implements 关键字实现接口。在类声明中,Implements关键字放在class声明后面

...implements 接口名称[, 其他接口名称, 其他接口名称..., ...] ...

下面看一个运用实例:

// 文件名Animal.java
// 定义接口

interface Animal {
   public void eat();
   public void travel();
}
// 文件名 : MammalInt.java 

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();
   }
}

编译结果:

Mammal eats
Mammal travels

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值