一.什么是多态?
1.多态的概念
多态是同一个行为具有多个不同表现形式或形态的能力。
父类的引用指向子类的对象,这就是多态。
格式: A ad=new B();
多态就是同一个接口,使用不同的实例而执行不同操作,举个例子,生活中的榨汁机,我们都是把水果放到榨汁机中去榨汁,但是你放进去什么水果,它就榨出来相对于的果汁,榨汁是一种行为,榨出来不同的的果汁就是不同的表现形式。
例:
父类:
public class A{
}
子类:
public class B extends A{
}
Test:
public class Test{
public static void main{
A ad=new B();//多态
}
}
2.通过数据的存储形式了解什么是多态
(1).基本数据类型中int、byte、float的内存存取形式
(2).A类既父类对象的内存结构图
(3).B类既子类对象的内存结构图
(4).子类即B类对象run()方法重写后的内存形式
(5).多态 A ad=new B(); ad的内存图
创建子类对象一定会创建父类对象,所以内存中会出现A和B的对象,但因为数据类型决定数据的存储形式,ab被A类型所锁定(决定),ab受制于数据类型A,所以只能调用A对象的数据。
如果子类发生过重写(重写的方法覆盖之前的方法),此时该重写的方法是父类与子类共用的,所以也能调用。
2.多态用法
(1).向上转型
向上转型,子类的对象可以被父类的类型所接收,即父类的引用指向子类的对象
3.实例演示
A.java
public class A {
public String show(D obj) {
return ("A and D");
}
public String show(A obj) {
return ("A and A");
}
}
B.java
public class B extends A{
public String show(B obj){
return ("B and B");
}
public String show(A obj){
return ("B and A");
}
}
C.java
public class C extends B{
}
D.java
public class D extends B{
}
Test.java
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));
}
输出结果:
第一个输出:
a1这个对象能调用到的方法有A里面show(D)和show(A); b是B类型的数据,而B是A的子类,所以B类型的数据可以向上转型到A,所以输出 1–A and A
第二个输出:
a1这个对象能调用到的方法有A里面show(D)和show(A); c是C类型的数据,而C是B的子类,且B是A的子类,所以C类型的数据可以向上转型到B,且B类型的数据可以向上转型到A,所以输出 2–A and A
第三个输出:
a1这个对象能调用到的方法有A里面show(D)和show(A); d是D类型的数据,所以输出 3–A and D
第四个输出:
a2这个对象能调用到的方法有A里面show(D)和B里面的show(A); b是B类型的数据,而B是A的子类,所以B类型的数据可以向上转型到A,所以输出 4–B and A
第五个输出:
a2这个对象能调用到的方法有A里面show(D)和B里面的show(A); c是C类型的数据,而C是B的子类,且B是A的子类,所以C类型的数据可以向上转型到B,且B类型的数据可以向上转型到A,所以输出 5–B and A
第六个输出:
a2这个对象能调用到的方法有A里面show(D)和B里面的show(A); d是D类型的数据,所以输出 6–A and D
第七个输出:
b这个对象能调用到的方法有A里面show(D)和B里面的show(Object)、show(A); b是B类型的数据,而B是A的子类,所以B类型的数据可以向上转型到A,所以输出 7–B and A
第八个输出:
b这个对象能调用到的方法有A里面show(D)和B里面的show(Object)、show(A); c是C类型的数据,而C是B的子类,且B是A的子类,所以C类型的数据可以向上转型到B,且B类型的数据可以向上转型到A,所以输出 8–B and A
第九个输出:
b这个对象能调用到的方法有A里面show(D)和B里面的show(Object)、show(A); d是D类型的数据,所以输出 9–A and D