首页 > 代码库 > 抽象类与接口

抽象类与接口

      1.定义:某些类的对象不能使用具体的语言进行描述,也无法说清楚,这种类在Java中被称为抽象类。其中abstract关键字是抽象类的关键字。

使用:使用abstract关键字定义的类(方法)称为抽象类(方法),这个方法本身没有任何意义,除非它被重写,而继承这个方法的抽象类必须被继承,实际上抽象类除了继承之外没有任何意义.

反过来讲,如果声明一个抽象方法,就必须将承载这个抽象方法的类定义为抽象类,不可能在非抽象类中获取抽象方法,换句话说,只要类中有一个抽象方法,此类就标记为抽象类.

      2.接口的引入:抽象类的所有子类需要将抽象类中的抽象方法进行覆盖,这样在多态机制中,就可以将父类修改成抽象类,以下面的例说明:

 1 public class Quadrangle {
 2     // 实例化保存四边形对象的数组对象
 3     private Quadrangle[] qtest = new Quadrangle[6];
 4     private int nextIndex = 0;
 5     
 6     public void draw(Quadrangle q) { // 定义draw()方法,参数为四边形对象
 7         if (nextIndex < qtest.length) {
 8             qtest[nextIndex] = q;
 9             System.out.println(nextIndex);
10             nextIndex++;
11         }
12     }
13     
14     public static void main(String[] args) {
15         // 实例化两个四边形对象,用于调用draw()方法
16         Quadrangle q = new Quadrangle();
17         q.draw(new Square()); // 以正方形对象为参数调用draw()方法
18         // 以平行四边形对象为参数调用draw()方法
19         q.draw(new Parallelogramgle());
20     }
21 }
22 
23 class Square extends Quadrangle { // 定义一个正方形类,继承四边形类
24     public Square() {
25         System.out.println("正方形");
26     }
27 }
28 
29 // 定义一个平行四边形类,继承四边形类
30 class Parallelogramgle extends Quadrangle {
31     public Parallelogramgle() {
32         System.out.println("平行四边形");
33     }
34 }

      运行结果:

正方形
0
平行四边形

  在这个例子中,将draw()方法设置为抽象方法,然后每个子类都重写这个方法来处理,但这又会出现太多冗余的代码,同时这个父类的局限性很大,也许某个不需要重写draw

()方法,如果将draw()方法放置在另一个类中,这样让那些需要draw()方法的类继承该类,而不需要draw()方法的类继承图形类,但所有的子类都需要图形类,类不能同时继承多个父类,面临这种问题,接口的概念便出现了。即,接口是抽象类的延伸,可以将它看成纯粹的抽象类,接口中的所有方法都没有方法体。对于上例中,可以将draw()方法封装到一个接口中,需要使用draw()方法的类实现这个接口,同时也继承图形类,即接口的必要性

如下图所示:

技术分享

接口使用interface关键字定义。

语法如下: 

1 public interface drawTest{
2   void draw();  //接口方法
3 }

注意:(1)public :接口可以像类一样被权限修饰符修饰,但public关键字仅限用于接口在与其他同名的文件中被定义 

        (2)interface:定义接口关键字

        (3)drawTest:接口名称

 (4)在接口中定义的方法必须定义成public或abstract形式,其他修饰符权限不被Java编译器认可,即使不将该方法声明为public形式,他也是public。

 (5)在接口定义中的任何字段都自动static和final的。

一个类实现一个接口可以用implements关键字,代码如下:

1 public class Parallelogram extends Quadrangle implements drawTest{
2 }

实例代码如下:

 1 interface drawTest { // 定义接口
 2     public void draw(); // 定义方法
 3 }
 4 
 5 // 定义平行四边形类,该类继承了四边形类,并实现了drawTest接口
 6 class ParallelogramgleUseInterface extends QuadrangleUseInterface
 7         implements drawTest {
 8     public void draw() { // 由于该类实现了接口,所以需要覆盖draw()方法
 9         System.out.println("平行四边形.draw()");
10     }
11     
12     void doAnyThing() { // 覆盖父类方法
13         // SomeSentence
14     }
15 }
16 
17 class SquareUseInterface extends QuadrangleUseInterface implements
18         drawTest {
19     public void draw() {
20         System.out.println("正方形.draw()");
21     }
22     
23     void doAnyThing() {
24         // SomeSentence
25     }
26 }
27 
28 class AnyThingUseInterface extends QuadrangleUseInterface {
29     void doAnyThing() {
30         
31     }
32 }
33 
34 public class QuadrangleUseInterface { // 定义四边形类
35     public void doAnyTthing() {
36         // SomeSentence
37     }
38     
39     public static void main(String[] args) {
40         drawTest[] d = { // 接口也可以进行向上转型操作
41         new SquareUseInterface(), new ParallelogramgleUseInterface() };
42         for (int i = 0; i < d.length; i++) {
43             d[i].draw(); // 调用draw()方法
44         }
45     }
46 }

运行结果:

正方形.draw()
平行四边形.draw()

   3.接口与继承

    在Java语言中不允许多重继承,但在使用接口就可以实现多重继承,因为一个类可以同时实现多个接口,这样可以将所需要继承的接口放置在imolements关键字后并使用逗号隔开,但这在一个类中产生庞大的代码量,因为继承一个接口时需要实现接口中所有的方法。

  多重继承语法如下:

  class 类名 implement 接口1,接口2,.......接口n;

在定义一个接口时使该接口继承另一个接口。

interface intf1{
}
interface intf2{
}

 

抽象类与接口