#java多态
重写override:继承关系
重载overload:同一个类
多态存在的三个必要条件:
一、继承;
二、重写;
三、父类引用指向子类对象。
好处:
可替换性(substitutability) | 多态对已存在代码具有可替换性 |
可扩充性(extensibility) | 多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能 |
接口性(interface-ability) | 多 态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的 |
灵活性(flexibility) | 体现了灵活多样的操作,提高了使用效率。 |
简化性(simplicity) | 多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要 |
举个常见的栗子:
class A
{
public String show(D obj){
return ("A and D");
}
public String show(A obj){
return ("A and A");
}
}
class B extends A
{
public String show(B obj){
return ("B and B");
}
public String show(A obj){
return ("B and A");
}
}
class C extends B{}
class D extends B{}
class E{
public static void main(String [] args)
{
A a1 = new A();//只用A类的
A a2 = new B();//a2中除了A的方法外,保留B类中重写override A类的方法(A类中被重写的方法被覆盖)
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.show(b)); //A and A 1
System.out.println(a1.show(c)); //A and A 2
System.out.println(a1.show(d)); //A and D 3
// ---------------------------------------------------------------------------------
System.out.println(a2.show(b)); //B and A 4
// a2.show(b),a2本来是一个B对象,但是将其赋给了A类变量,所以a2只保留了与父类A同名的属性和方法。
// a2.show(b)调用B类中的保留的与父类同名同参方法
System.out.println(a2.show(c)); //B and A 5
//C类是B类的子类,而B类又是A类的子类,所以C类对象可以当制作A类对象使用。结果与4一致。
System.out.println(a2.show(d)); //A and D 6
// ---------------------------------------------------------------------------------
//A类有此方法
System.out.println(b.show(b)); //B and B 7
System.out.println(b.show(c)); //B and B 8
System.out.println(b.show(d)); //A and D 9
// ---------------------------------------------------------------------------------
// B b2= (B) new A();// 出现错误,必须是父类2对象是子类new出来的时候才行,如下:
B b2= (B) a2;
System.out.println(b2.show(b)); //B and B 10
System.out.println(b2.show(c)); //B and B 11
System.out.println(b2.show(d)); //A and D 12
}
}
两个问题:
- 是子类与父类的重写关系。
- 是重载方法的调用问题。
子类对象可以直接当成父类对象使用、但反过来就不可以。