1、多态概述
1、定义:多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。每个子类的实例但是其父类的实例,但是反过来不成立,例如:动物,狗是动物的一种,猫也是动物的一种。但是不是所有动物都是猫、狗。
2、多态是继封装、继承之后,面向对象的第三大特性。
3、多态体现为父类引用变量可以指向子类对象。
4、前提条件:必须有子父类关系。
注意:在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。
5、多态的定义与使用格式:
定义格式:父类类型 变量名=new 子类类型();
6、多态的好处:
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
2、一个简单的多态样例
public class Demo {
public static void main(String[] args) {
Circle a = new Circle();
a.draw();
Square b = new Square();
b.draw();
Triangle c =new Triangle();
c.draw();
}
}
class Shape {
void draw() {}
}
class Circle extends Shape {
void draw() {
System.out.println("Circle.draw()");
}
}
class Square extends Shape {
void draw() {
System.out.println("Square.draw()");
}
}
class Triangle extends Shape {
void draw() {
System.out.println("Triangle.draw()");
}
}
3、重写
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
例如:
class animals {
void eat() {
System.out.print("I don't know who I am\n");
}
}
class cat extends animals{
void eat() {
System.out.print("I eat fish\n");
}
}
这就是子类对父类中eat()的重写。
4、类型转换(向上转型,向下转型)
- 多态的转型分为向上转型和向下转型两种
- 向上转型:多态本身就是向上转型过的过程
使用格式:父类类型 变量名=new 子类类型();
适用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作。 - 向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型
使用格式:子类类型 变量名=(子类类型) 父类类型的变量;
适用场景:当要使用子类特有功能时。
样例:
public class Animal {
public static void main(String[] args) {
animals a = new cat(); // 向上转型
a.eat(); // 调用的是 Cat 的 eat
//a.text(); 错误引用
cat c = (cat)a; // 向下转型
c.eat();
c.text();
}
}
class animals {
void eat() {
System.out.print("I don't know who I am\n");
}
}
class cat extends animals{
void eat() {
System.out.print("I eat fish\n");
}
public void text() {
System.out.print("wrong\n");
}
}
class dog extends animals{
void eat() {
System.out.print("I eat bone\n");
}
}
结果:
a.text()为错误代码,因为text()为子类方法。
5、Polymorphism
多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。