Java的多态性理解
格式: 父类 obj=new 子类();
直接通过对象名访问成员变量:看*左边*是谁就是谁的,没有则向上找
间接通过成员方法访问成员变量:看*该方法属于谁*,优先用谁,没有则向上找
直接访问成员方法,看new的是谁,就优先用谁,没有则向上找
编译看左,运行看右
定义父类和子类
public class Polymorphism {
public static void main(String[] args) {
A a1 = new A();
A a2 = new B(); //创建B对象,转化成A对象,拥有的成员函数是showD(),和覆盖掉show(A){A and A }的show(A){B and A}成员函数
B b = new B(); //B继承A,拥有showD()和show(A){B and A}成员函数
C c = new C();
D d = new D();
System.out.println(a1.show(b)); //使用a1的成员函数show(A)
System.out.println(a1.show(c)); //使用a1的成员函数show(A)
System.out.println(a1.show(d)); //使用a1的成员函数show(D)
System.out.println(a2.show(b)); //使用覆盖后的show(A)
System.out.println(a2.show(c)); //使用覆盖后的show(A)
System.out.println(a2.show(d)); //使用继承的show(D)
System.out.println(b.show(b)); //使用B的show(B)
System.out.println(b.show(c));
System.out.println(b.show(d));
}
}
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{
}
}
————————————————
版权声明:本文为CSDN博主「aoyingge」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/aoyingge/article/details/8602496
**在主函数中**
//创建父类对象
A a1 = new A();//用A类来创建一个空间,将地址赋给A的对象a1,本质还是A
A a2 = new B();//用A类来创建一个空间,将地址赋给A的对象a2,本质还是B
/* 此时的a2具有的方法:被B覆写的Fu方法和A本身带有的方法,由调用成员方法,由编译看左边,运行看右边,可知不包括B独有的而A没有的方法
*/
B b = new B();//用B来创建一个空间,将地址赋给A的对象b,这样b就既有
自己的本身带有的方法又有A继承过来的方法;
总的来说就是向下转型时,父类的对象所带有的方法只能是它本身自带的方法和
子类覆写的方法
输出结果是:
A and A
A and A
A and D
B and A
B and A
A and D
B and B
B and B
A and D