多态的概念
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作。
多态的原理
继承关系使一个子类能继承父类的特征,每个子类的实例都是其父类的实例,因此当形参是父类型时,总是可以把子类的实例传给这个形参。
并且所有使用父类型对象的地方都可以使用子类型的对象。
多态的实现
多态的实现需要的是对于父类方法的重写,能使得所有子类对象使用与父类同名的方法进行操作,即实现同一个接口。
多态存在的三个必要条件
一、要有继承;
二、要有重写;
三、父类引用指向子类对象,可以有一个父类,多个子类。
Java中多态的使用
向上转型: 子类的对象可以直接赋给父类的对象变量。
向下转型: 将父类的引用强制转换成子类的引用,必须强制转换。
父类:
public class GeometricObject {
private String color="white";
private boolean filled;
private java.util.Date dateCreated;
public GeometricObject() {
dateCreated=new java.util.Date();
}
public GeometricObject(String color,boolean filled) {
dateCreated=new java.util.Date();
this.color=color;
this.filled=filled;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color=color;
}
public boolean isFilled() {
return filled;
}
public void setFilled(boolean filled) {
this.filled=filled;
}
public java.util.Date getDateCreated() {
return dateCreated;
}
public String toString() {
return "created on "+dateCreated+"\ncolor: "+color+" and filled: "+filled;
}
}
子类 圆
public class Circle extends GeometricObject {
private double radius;
public Circle() {
}
public Circle(double radius) {
this.radius=radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius=radius;
}
public double getArea() {
return radius*radius*Math.PI;
}
public double getDiameter() {
return 2*radius;
}
public double getPerimeter() {
return 2*radius*Math.PI;
}
public void printCircle() {
System.out.println("The circle is created "+getDateCreated()+" and the radius is "+radius);
}
}
子类 矩形
public class Rectangle extends GeometricObject {
private double width;
private double height;
public Rectangle() {
}
public Rectangle(double width,double height) {
this.width=width;
this.height=height;
}
public Rectangle(double width,double height,String color,boolean filled) {
this.width=width;
this.height=height;
setColor(color);
setFilled(filled);
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width=width;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height=height;
}
public double getArea() {
return width*height;
}
public double getPerimeter() {
return 2*(width+height);
}
}
测试
public class PolymorphismDemo {
public static void main(String[] args) {
displayObject(new Circle(1,"red",false));
displayObject(new Ractangle(1,1,"black",true));
}
public static void displayObject(GeometricObject object) {
System.out.println("Created on "+object.getDateCreated()+". Color is "+object.getColor());
}
}
运行结果
输出了创建日期,是子类对象传给了父类的形参