什么是多态?
多态简单点多说就是:一个接口多个实现,就是同一种事物表现出的多种形态。或者说多态是指不同的子类在继承父类后分别都重写覆盖了父类的方法,即父类同一个方法,在继承的子类中表现出不同的形式。
说道多态就得想起“面向对象的三个基本特征是:封装、继承、多态。建议你多看看面向对象方面的知识。”
多态的前提:
子父类的继承关系
方法的重写
父类引用指向子类
动态绑定:运行期间调用的方法,是根据其具体的类型(例如下边的代码:在运行的时候调用的就是动物中具体的猫吃的方法)
public class PoymorphicDemo {
public static void main(String[] args) {
/*Cat c = new Cat();
c.eat();*/
Animal an = new Cat();
an.eat();
}
}
class Animal{
public void eat() {
System.out.println("吃东西");
}
}
class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
多态的作用:
1. 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。
2. 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。
在讨论多态之前先研究一个问题:什么是方法调用绑定-------------》将一个方法调用同一个方法主体关联起来被称为绑定
博客链接:http://blog.sina.com.cn/s/blog_600046120100wdza.html
package com.day2018811.polymorphic;
public class Instrument {
public void play(Note n) {
System.out.println("Instrument.play()");
}
}
package com.day2018811.polymorphic;
public enum Note{
MIDDLE_C , C_SHARP , B_FLAT;
}
package com.day2018811.polymorphic;
public class Wind extends Instrument {
public void play(Note n) {
System.out.println("Wind.play() "+n);
}
}
package com.day2018811.polymorphic;
public class TestMusic {
public static void tune(Instrument i) {
i.play(Note.MIDDLE_C);
}
public static void main(String[] args) {
Wind flute = new Wind();
tune(flute);
}
}
多态的特点:
* 成员变量 编译时看的是左边,运行时看的是左边
* 成员方法 编译时看的是左边,运行时看的是右边
* 静态方法 编译时看的是左边,运行时看的是左边
public class PoymorphicDemo02 {
public static void main(String[] args) {
Dad d = new Kid();
//System.out.println(d.num);//out:20,
d.method();
d.method2();//使用变量去调用静态方法,其实相当于用变量类型的类名去调用
}
}
class Dad{
int num = 20;
public void method() {
System.out.println("我是父类的方法");
}
public static void method2() {
System.out.println("我是父类的方法j静态2");
}
}
class Kid extends Dad{
int num = 10;
public void method() {
System.out.println("我是子类的方法");
}
public static void method2() {
System.out.println("我是子类的方法j静态2");
}
}
总结:编译时看的都是左边,但是运行时成员方法看的是右边,其他的看的都是左边