首页 > 代码库 > 抽象类与接口
抽象类与接口
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
平行四边形
1
在这个例子中,将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{ }
抽象类与接口