面向对象的三大特性:继承,封装,多态
多态
1.多态定义
一种数据类型,多种形态。指不同继承关系的对象,调用同一函数,产生不同结果的行为。
2.多态的必要条件
1.继承:有父子类关系
2.重写:相同函数名,相同参数列表,相同返回值
3.向上转型:父类数据类型 name = new 子类数据类型 ();
名字相同的成员变量的值与父类数据类型里的一致,名字,参数列表,返回值一样的方法与子类里的一样
3.多态分为静态多态和动态多态。
静态多态
主要指方法的重载,根据参数列表和返回值不同区分不同的函数,编译之后会变成两个不同的函数。
动态多态
运行时,先去子类里找同名方法,找不到了再去父类中找,一层一层往上升。
代码实例
class A extends B{
String z = "A";
public void ma(){
System.out.println(z+".....ma......");
}
}
class B extends C{
String z = "B";
public void mb(){
System.out.println(z+"......mb.....");
}
@Override
public void mc() {
System.out.println("B......mc.....");
}
}
class C {
String z = "C";
public void mc(){
System.out.println(z+"......mc.....");
}
}
public class Test {
public static void main(String[] args) {
A a = new A();
a.ma();
//运行结果为: A.....ma......
a.mb();
//运行结果为: B......mb.....
a.mc();
//运行结果为: B......mc..... 在B里找到了mc方法
System.out.println(a.z);
//运行结果为: A
C c = new B();
c.mc();
//运行结果为: B......mc..... 在子类里找到了mc方法
System.out.println(c.z);
//运行结果为: C 与父类里的一样
}
}
较难实例
public class A {
public String show(D obj) {
return ("A and D");
}
public String show(A obj) {
return ("A and A");
}
}
public class B extends A{
public String show(B obj){
return ("B and B");
}
public String show(A obj){
return ("B and A");
}
}
public class C extends B{
}
public class D extends B{
}
public class Test {
public static void main(String[] args) {
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println("1--" + a1.show(b));
System.out.println("2--" + a1.show(c));
System.out.println("3--" + a1.show(d));
System.out.println("4--" + a2.show(b));
System.out.println("5--" + a2.show(c));
System.out.println("6--" + a2.show(d));
System.out.println("7--" + b.show(b));
System.out.println("8--" + b.show(c));
System.out.println("9--" + b.show(d));
}
}
运行结果
1--A and A 2--A and A 3--A and D 4--B and A 5--B and A 6--A and D 7--B and B 8--B and B 9--A and D