Java的多态跟C++差不多,主要是通过方法的重载和覆盖来实现类的多态性的。
一、方法的重载(overloading)
方法的重载是指在一个类中,出现多个方法名相同,但参数个数货参数类型不同的方法。
例子中同样是一个getArea函数,由于参数个数的不同,返回的分别是圆形、矩形以及梯形的面积。
public class Calculate {
final float PI = 3.14159f;
public float getArea(float r)
{
float area = PI * r * r;
return area;
}
public float getArea(float l, float w)
{
float area = l * w;
return area;
}
public float getArea(float up, float down, float high)
{
float area = (up + down) * high / 2;
return area;
}
public static void main(String[] args)
{
Calculate c = new Calculate();
float r = 10;
float l = 5;
float w = 4;
System.out.println("半径为10的圆的面积是" + c.getArea(r));
System.out.println("长为5宽为4的矩形的面积是" + c.getArea(l,w));
System.out.println("上低为5下底为4高为10的梯形的面积是" + c.getArea(l,w,r));
}
}
运行结果是
半径为10的圆的面积是314.159
长为5宽为4的矩形的面积是20.0
上低为5下底为4高为10的梯形的面积是45.0
二、方法的覆盖(Overriding)
方法的覆盖发生在继承中,当子类继承父类后,如果子类的方法名誉父类的方法名相同,那么子类就不能继承父类的方法,或者说父类重的方法被子类覆盖。
例子中有覆盖了父类Animal的move方法的Bird和Horse,还有没有覆盖父类的dog,还有父类Animal4个类的move函数的结果。
public class Zoo {
public static void main(String[] args)
{
Bird bird = new Bird();
System.out.println("执行bird的move函数的结果是");
bird.move();
Horse horse = new Horse();
System.out.println("执行horse的move函数的结果是");
horse.move();
Dog dog = new Dog();
System.out.println("执行dog的move函数的结果是");
dog.move();
Animal animal = new Animal();
System.out.println("执行animal的move函数的结果是");
animal.move();
}
}
运行结果是
执行bird的move函数的结果是
鸟会飞翔
执行horse的move函数的结果是
马会跑
执行dog的move函数的结果是
动物会运动
执行animal的move函数的结果是
动物会运动
总结:
1、在方法重载中,方法返回值的类型不能作为区分方法重载的标志。
2、在方法覆盖中,需要注意以下几点
(1)子类不能覆盖父类中声明为final或者static的方法。
(2)子类必须覆盖父类中声明为abstract的方法,或者子类也将该方法声明为abstract。
(3)子类覆盖父类中的同名方法时,子类中的声明也必须和父类中被覆盖的方法的声明一样,否则就无法覆盖,而会变成重载,即父类子类的两个函数都存在,根据参数的不同来区分。