目录
一、什么是多态
- 多态是同一个行为具有多个不同的表现形式或形态的能力
二、多态实现的必要条件
- 在多态中必须存在有继承或实现关系的子类和父类
- 子类对父类中的某些方法进行重新定义
- 父类引用指向子类对象 ---->向上转型
示例:
public class Test {
public static void main(String[] args) {
A a = new B();
System.out.println(a.show1());
System.out.println(a.show2());
System.out.println(a.show3());
}
}
class A {
public String show1() {
return "111";
}
public String show2() {
return "222";
}
}
class B extends A {
public String show2() {
return "333";
}
public String show3() {
return "333";
}
}
该代码画出过程分析图:
可以看出,该代码虽然创建的是B类型对象,但最后选择a数据类型时选择的A类,因此a只能调用到图中的show1()和被创建B类型时重写后的show2(),而无法调用到B类中的show3(),这就是多态使用的一个基本示例
三、多态的特点
- 子类和父类存在同名的成员变量时,访问的是父类的成员变量
- 子父类存在同名的非静态成员方法时,访问的是子类中重写的方法
- 子父类存在同名的静态成员变量成员方法时,访问的是父类的成员
- 不能访问子类独有的方法
四、引用类型转换
对于父类和子类的关系,用图来描述
People父类是大范围的类型,而Student和Teacher类均属于People类的子类,所以对于子类这种范围小的,我们可以自动转型给父类的变量,而儿子向上转型,父亲是唯一的,因此是自动转换
使用格式:
父类类型 变量名 = new 子类类型();
People student = new Student()
通过Student类new出来的变量student作为中介,再通过People类选择指向,从而完成了向上转型
相当于是
People student = (People)new Student()
五、通过一个题目来分析多态的使用
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~3
a1创建的是A类对象,选择的数据类型也是A,因此可以调用A类当中的Show(D obj)和Show(A obj)方法
1、a1.Show(b)传参为B类型的b,B继承A,所以b可以向上转型成A类型,因此执行Show(A obj)方法,所以输出 A and A
2、a1.Show(c)传参为C类型的C,C继承B,B继承A,所以c可以向上转型成B类型再继续向上转型成A类型,因此执行Show(A obj)方法,所以输出 A and A
3、a1.Show(d)传参为D类型的d,因此执行Show(D obj)方法,所以输出 A and D
4~6
a2创建的是B类对象,选择的数据类型是A类型,因此a2可以调用A类当中的Show(D obj)和被B类重写过后的Show(A obj)方法
4、a2.Show(b)传参为B类型的b,B继承A,所以b可以向上转型成A类型,因此执行被B类重写后的Show(A obj)方法,所以输出 B and A
5、a2.Show(c)传参为C类型的C,C继承B,B继承A,所以c可以向上转型成B类型再继续向上转型成A类型,因此执行被B类重写后的Show(A obj)方法,所以输出 B and A
6、a2.Show(d)传参为D类型的d,因此执行A中的Show(D obj)方法,所以输出 A and D
7~9
b创建的是B类对象,选择的数据类型是A,因为B继承A,所以b可以调用A类当中的Show(D obj)方法和B类当中的show(B obj)、show(A obj)(该方法对A中该方法进行了重写)方法
7、b.show(b)传参为B类型的b,B继承A,所以b可以向上转型成A类型,因此执行B类中的Show(A obj)方法,所以输出 B and A
8、b.show(c)传参为C类型的C,C继承B,B继承A,所以c可以向上转型成B类型再继续向上转型成A类型,因此执行B类中的Show(A obj)方法,所以输出 B and A
9、b.show(d)传参为D类型的d,因此执行A中的Show(D obj)方法,所以输出 A and D
后言
- 若要继续练习掌握该部分知识可前往Java基础练习题(2)进行练习