概念:
多态就是事物存在的多种形态
Java中的多态存在的条件:
- 存在继承关系
- 子类中要有对父类的方法重写
- 多态要有父类引用指向子类对象
多态中的访问成员变量:
编译看左边(父类),运行看左边(父类)
Father son = new Son();
System.out.println(son.num);
输出结果是看Father类中的num。
多态访问成员方法:
编译看左边(父类) ,运行看右边(子类)
Father son = new Son();)
son.eat();
执行的是Son这个类中的eat方法。
多态访问静态方法:
编译看左边(父类) ,运行看左边(父类)
但是这种写法没有必要,因为静态方法可以直接调用,不需要通过对象。
多态中的向上转型和向下转型:
向上转型:子类对象赋值非父类
Person p = new SuperMan();
向下转型:需要强制转型
SuperMan sm = (SuperMan)p;
注意点:父类的真实对象必须是子类对象,否则会有问题
假设Person是父类
//下面的是错误的
Person p1 = new Person();
SuperMan sm2 = (SuperMan) p1;
多态的好处和坏处:
好处:
- 提高了代码的维护性(继承保证)
eg:在父类改一个属性不用每个子类都改属性 - 2.提高代码的扩展性(多态保证)
eg:方法中使用父类为参数,来实现方法或者属性的调用
弊端:
父类不能使用子类的特有属性和行为
练习题:
A a = new B();//多态方法运行看右边
//*********永远都是看右边的,这里是多态访问方法,并不能使用就近原则
a.show();
B b = new C();
b.show();
}
}
class A{
public void show(){
show2();
}
public void show2(){
System.out.println("我");
}
}
class B extends A{
public void show2(){
System.out.println("爱");
}
}
class C extends B{
public void show(){
super.show();//找父类的show方法,继续向上找
}
public void show2(){
System.out.println("妳");
}
}
输出结果:
爱
妳