1:什么是多态?
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作。
多态性是对象多种表现形式的体现。
事物在运行过程中存在不同的状态。
多态是同一个行为具有多个不同表现形式或形态的能力。
嗯~ o( ̄▽ ̄)o有点难懂
看了图应该会好理解一点,同样是打印这个行为,然后却有彩色与黑白两种表现形式。
这下应该初步懂了是个什么了吧。
进一步呢,多态又分为 编译时多态和运行时多态。
编译时多态:比如重载
运行时多态:比如重写
2:多态存在的三个必要条件
继承、重写、基类引用指向派生类对象,即父类引用指向子类对象:Parent p = new Child();
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
代码例子:
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()");
}
}
多态的优点:
分析以上代码可以知道:同样是draw这个行为,我可以通过调用Circle.draw()、Square.draw()、Triangle.draw()来实现三种不同图形的绘制,从而实现了实现类的自动切换,所以多态的好处体现在:可以使我们的程序编写的更简单,并有良好的扩展性。
多态的缺点:
不能使用子类特有的成员属性和子类特有的成员方法。
//改写上述代码的Triangle类
class Triangle extends Shape {
void draw() {
System.out.println("Triangle.draw()");
}
void fillColor(){
System.out.println("Triangle.fillColor()");
}
}
/**
* 测试多态的弊端!
*/
public class Demo {
public static void main(String[] args) {
Shape shape = new Triangle();
shape.draw();
shape.fillColor();//编译报错,编译看左边,Shape没有这个方法
}
}
可以看到Circle类和Square类、Triangle类有个共同的draw方法,但是呢,Triangle类多了个fillColor的方法。而对于Shape对象来说,它本身类没有fillColor的方法,所以它的编译就直接没有通过了!也就代表着,父类无法调用子类独有的方法。所以就有了“向下转型”的出现
3:多态的实现方式
方式一:重写:
方式二:接口:
1.生活中的接口最具代表性的就是插座,例如一个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各自规定的接口规则,有可能到国外就不行,那是因为国外自己定义的接口类型。
2. java中的接口类似于生活中的接口,就是一些方法特征的集合,但没有方法的实现。
方式三:抽象类和抽象方法
4:多态的定义与使用格式
定义格式:父类类型 变量名=new 子类类型();