2007-10-21

方法重写和接口的思考

关键字: Java学习

昨天一个网友问我“你是怎么理解方法重写和接口的?”开始我以为可以很快的回答他的问题,但是后来发现没那么简单。

现在就谈谈我对接口的理解,在我看来要理解接口,就必须先理解多态是怎么一回事,应为单讲接口不好理解,下面是我对方

法重写和接口的理解:

方法重写允许Java支持运行时的多态性

运行时多态性是面向对象设计方法实现代码重用和健壮性的最大机制之一,代码库在维持抽象接口同时不用重新编译的情

况下即可调用新类的实例。

成功应用多态性的关键还要理解超类和子类形成的从简单到复杂的层次。为了正确应用多态性,超类提供了子类可以

直接使用的所有元素,多态性也定义了派生类必须实现自己的方法,这允许子类在加强一致接口的同时灵活的定义它们自己的

法,因此通过过同时使用继承和重写方法,超类能够定义供其所有子类使用的方法的通用形式。重写方法是Java实现其多态性

“一个接口,多个方法”的另一种形式。

让我们看一个使用方法重写的更实际的例子。下面的程序创建了一个称为Figure的超类,用于存储各种二维对象的大小。它还

定义了一个称为area()的方法,用于计算对象的面积。该程序重Figure派生了两个子类,第一个是Rectangle,第二个是

Triangle.。两个子类都重写了area()方法,它们分别返回长方形和三角形的面积。

java 代码
 
  1. //代码如下:  
  2.   
  3. class Figure{  
  4.   
  5.       double dim1;  
  6.   
  7.       double dim2;  
  8.    
  9. Figure(double a,double b){  
  10.   
  11.       dim1=a;  
  12.   
  13.       dim2=b;  
  14.   
  15. }  
  16.   
  17. double area(){  
  18.   
  19.       System.out.println("Area for Figure is undefined.");  
  20.   
  21.       return 0;  
  22.   
  23.      }  
  24.   
  25. }  
  26.   
  27. class Rectangle extends Figure{  
  28.   
  29.       Rectangle(double a,double b){  
  30.   
  31.        super(a,b);  
  32.   
  33. }  
  34.   
  35. double area(){  
  36.   
  37.         System.out.println("Inside Area for Triangle.");  
  38.   
  39.              return dim1*dim2;  
  40.   
  41.       }   
  42.   
  43. }  
  44.   
  45. class Triangle extends Figure{  
  46.   
  47.            Triangle(double a,double b){  
  48.   
  49.                super(a,b);  
  50.   
  51. }  
  52.   
  53. double area(){  
  54.   
  55.              System.out.println("Inside Area for Triangle.");  
  56.   
  57.              return dim1*dim2/2;  
  58.   
  59.           }  
  60.   
  61. }  
  62.   
  63. public class FindAreas {  
  64.   
  65.        public static void main(String[] args) {  
  66.   
  67.        Figure f=new Figure(10,10);  
  68.   
  69.        Rectangle r=new Rectangle(9,5);  
  70.   
  71.        Triangle t=new Triangle(10,8);  
  72.   
  73.        Figure figref;  
  74.   
  75.         figref=r;  
  76.   
  77.        System.out.println("Area is "+figref.area());  
  78.   
  79.         figref=t;  
  80.   
  81.         System.out.println("Area is "+figref.area());  
  82.   
  83.         figref=f;  
  84.   
  85.        System.out.println("Area is "+figref.area());  
  86.   
  87.       }  
  88.   
  89. }  
  90.   
  91. 输出结果:  
  92.   
  93. nside Area for Triangle.  
  94.   
  95. Area is 45.0  
  96.   
  97. Inside Area for Triangle.  
  98.   
  99. Area is 40.0  
  100.   
  101. Area for Figure is undefined.  
  102.   
  103. Area is 0.0  

通过继承和运行是多态性的双重机制,可以定义一个一致的接口,该接口可以被几个不同但却相关的对象引用,此时,如果一个对象是从Figure派生的,那么它的面积可以通过调用area()方法获得。不管图形是何种类型,这个操作的接口是相同的。

接口运用于支持运行时的动态方法解析

接口的目的在于定义一组可实现的方法,实现某些接口的类必须实现该接口所定义的所有方法,只要对象有实现某个接

口,就可以通过该接口来实现对象上对应的方法。无论该对象实际上属于哪个类,都要靠接口来实现。

通常,为了从一个类调用另一个类的方法 ,在编译时,两个类都需要声明,以便java编译器能够进行检查方法声明是否兼容。

这有利于静态类和不可拓展的类创造环境,这在一个与此的类似的系统中,不可避免的会使类层次的功能变得越来越强,以致

于越来越多的子类都可以利用这种机制。接口可以避免这种问题,它把一个方法或一组方法的定义和继承层次分开,由于接口

与类位于不同的层次,所以按照类的术语,不相关的类可以实现同一个接口,这就是接口的强大之处。通过一个接口引用变量

访问一个接口的多个实现是Java实现运行时多态性的最强大的功能(接口添加了很多程序所需的多数功能,在像C++这样的语

言中,这些应用程序通常借助于多重继承)。

要理解接口的强大功能,让我们来看个实际的例子。

评论
发表评论

您还没有登录,请登录后发表评论

gml520
搜索本博客
我的相册
Ab40424d-27ea-32ee-801f-3c3df41136a0-thumb
linuxkerel.jpg
共 5 张
最近加入圈子
存档
最新评论