java多态

来源:互联网 发布:mysql match 完全匹配 编辑:程序博客网 时间:2024/04/30 06:27

java多态确实比较麻烦!!!!

多态顾名思义就是多种形态。
多态分为两种:静态多态和动态多态。
所谓静态就是重载,也就是在编译的时候已经确认好了将要调用哪个方法。

动态多态:
三种表现形式
一,方法重写。
二,接口。
三,父类指向子类。

重写:区别重写和重载很容易,重载是在一个类里面方法名相同,参数或者返回值不同的,而重写则是两个类里面,子类对父类的方法重写,也就是函数体不一样。
举个例子,父类里面有个方法是1……n的和
int sum(int n)
{
int result = 0;
      for(int i = 1;i <=  n;i++)
  {
result = result + i;
}
return result;
}如果你 感觉不爽,感觉效率太低,于是你就重写了父类的方法,代码如下:
int sum(int n)
{
int result = 0;
      result = n*(n + 1)/2;
return result;
}

接口:别人定义一些协议,也就是没有函数体的函数,为什么不写函数体,因为编程的最高境界就是针对接口编程。
举个例子:
如果没有接口,很有可能出现这种情况,一个求和函数,我有可能 写成这样,int sum1(int   x),每个人都有自己写求和的方法名 ,这样很不方便,这样不好表述,但是当我们看见接口的好处,就能明白了。
interface test
{
      int sum(int n);
}
class Test1 implements test
{
int sum(int n)
{
int result = 0;
      for(int i = 1;i <=  n;i++)
  {
result = result + i;
}
return result;
}

void display()
{
     System.out.println("Hello,world!");
}

int sub (int x,int y)
{
     return x - y;
}
}

class Test2 implements test
{
int sum(int n)
{
int result = 0;
       
      result = n*(n + 1)/2;

return result;
}

void show()
{
     System.out.println("Hello,world!");
}

}

void main()
{
     Test1 one = new Test1();
      one.sum(100);
      one.display();
      one.sub(4,5);
     如果我忽然想用Test2这个类来实现上面的功能,我只要把上面的代码给删掉并写以下的代码
     Test2 one = new Test1();
      one.sum(100);
      one.show();

     其实实现的功能完全一样(先不说sub这个方法),如果display和show改成一个方法名,那我就只要把Test1修改成Test2就可以了,多么happy啊,幸亏sum是一个接口,所以他统一了函数名,返回值,参数,只有函数体不同了而已,但是对使用者来时,他对函数体根本就不关心,他只关心能不能实现功能,所以我们能体会到为什么要用接口来约束一些东西了,所以我们就不修改他的代码了,假设我们把显示函数写在接口里面,两个类都用show方法。但是还有一个问题,Test1中间有个方法int sub(int x,int  y),而Test2中间没有,这样如果把Test1修改成Test2,还得删掉减法的方法,为了解决这个问题,所以我们就必须要做到针对接口编程。

   test one = new Test1;如果调用one的方法的话,Test1和Test2中间都有,如果有天想把它改成Test2的话,对下面的代码不会有任何改动,这样实实在在的降低了代码间的耦合度。


父类指向子类:子类有一块空间,父类指向子类属于自己的那块空间。
父类指向子类和只针对接口编程差不多。
从以上三种表现形式可以得出:
他们对调用者来说,都是相同的,而他们实现功能是却各有各的 不同。
实在有点难写,以后待续!!!!

原创粉丝点击