1.多态性是面向对象程序设计的重要部分。在Java语言中,通过使用方法的重载和重写实现类的多态性。
2.重写(覆盖)是指父子类之间的关系,当子类继承父类中所有可能被子类访问的成员方法时,如果子类的方法名与父类的方法名相同,那么子类就不能继承父类的方法,这时,称为子类的方法重写了父类的方法。重写体现了子类补充或者改变父类方法的能力。通过重写,可以使一个方法在不同的子类中表现出不同的行为。多态其实不依赖具体类,依赖抽象类和接口,接下来附上一个例子:
目录结构:
Animal.java文件:
package tom.bean;
/*
* 定义一个动物类,作为父类
*/
public class Animal {
public Animal(){ //无参构造方法
}
public void eat(){ //eat()方法
System.out.println("动物吃东西");
}
}
Dog.java文件:
package tom.bean;
/*
* 定义一个狗类,作为动物类的子类,继承动物类
*/
public class Dog extends Animal{
public Dog(){ //无参构造方法
}
public void eat(){ //eat()方法,重写了Animal类的eat()方法
System.out.println("狗吃狗粮");
}
}
Cat.java文件:
package tom.bean;
/*
* 定义一个猫类,作为动物类的子类,继承动物类
*/
public class Cat extends Animal{
public Cat(){ //无参构造方法
}
public void eat(){ //eat()方法,重写了Animal类的eat()方法
System.out.println("猫吃猫粮");
}
}
Tiger.java文件:
package tom.bean;
/*
* 定义一个Tiger老虎类,继承Animal动物类
*/
public class Tiger extends Animal {
}
Test.java文件,测试类:
package tom.test;
import tom.bean.Cat;
import tom.bean.Dog;
import tom.bean.Tiger;
/*
* 测试类,打印输出信息
*/
public class Test {
public static void main(String[] args){
Dog dog=new Dog();//创建Dog类的对象
System.out.println("执行dog.eat();语句后的结果:");
dog.eat();//调用eat()方法
Cat cat=new Cat();//创建Cat类的对象
System.out.println("执行cat.eat();语句后的结果:");
cat.eat();//调用eat()方法
Tiger tiger=new Tiger();//创建Tiger对象
System.out.println("执行tiger.eat();语句的结果:");
tiger.eat();//调用eat()方法,此时调用的是父类的eat()方法
}
}
运行Test.java文件后,结果为:
从上面的例子可以知道,Dog类和Cat类都重写了父类的eat()方法,所以执行的是子类的eat()方法,但是Tiger类没有重写父类的方法,所以执行的是父类中的eat()方法。
3.方法的重载是指在一个类中出现多个方法名相同,但参数个数或参数类型不同的方法,则称为方法的重载。Java语言在执行该具有重载关系的方法时,将根据调用参数的个数和类型区分具体执行的是哪个方法。下面给出一个例子:定义一个Shape类,在类中定义两个名称为getArea()的方法(参数个数不同)和两个名称为draw()的方法(参数类型不同):
Shape.java文件:
package tom.bean;
public class Shape {
final float PI=3.14159f;//定义一个用于表示圆周率的常量PI
public float getArea(float r){ //定义一个用于计算面积的方法getArea(),求圆形的面积
float area=PI*r*r;
return area;
}
public float getArea(float length,float width){ //重载getArea()方法,用来求矩形的面积,重载方法带的参数个数不同
float area=length*width;
return area;
}
//画任意形状的图形
public void draw(int num){ //定义一个用于画图的方法draw()
System.out.println("画一个"+num+"个任意形状的图形");
}
//画指定形状的图形
public void draw(String shape){ //重载draw()方法,重载方法中带的参数类型不同
System.out.println("画一个"+shape);
}
//主方法
public static void main(String[] args){
Shape shape=new Shape();//创建Shape类的对象
float l=10;//声明一个常量,初始化为10,表示矩形的长
float w=20;//声明一个常量,初始化为20,表示矩形的宽
float rectangleArea=shape.getArea(l, w);//获得矩形的面积,并赋予rectangleArea
System.out.println("长度为"+l+",宽度为"+w+"的矩形面积为:"+rectangleArea);//打印输出矩形的面积
float r=5;
float circleArea=shape.getArea(r);
System.out.println("半径为"+r+"的圆形的面积为:"+circleArea);
shape.draw(3);//调用draw()方法
shape.draw("圆锥");
}
}
运行此程序,结果为:
注:重载的方法直接并不一定必须有联系,但是为了提高程序的可读性,一般只重载功能相似的方法,在进行方法的重载时,方法返回值的类型不能作为区分方法的标志!
4.以上就是通过方法的重写和重载实现类的多态性,仅供大家学习参考。