java基础-多态
来源:互联网 发布:php 即时通讯插件 编辑:程序博客网 时间:2024/06/04 18:40
一、多态定义
多态:同一个行为具有多个不同表现形式或形态的能力。
对于继承来说,
父类 a = new 子类();
a.子类重写的父类方法();
这就是多态。只有在运行时才知道调用谁的方法,或者行为。
比较经典的一句话:当超类对象引用变量引用子类对象时,被引用对象的类型决定了调用谁的成员方法,而不是引用变量的类型,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。
为什么???因为java继承中支持向上转型,父类的引用可以调用父类的属性方法,或者被子类重写的方法。对于子类中特别的方法或者属性,对父类来讲是不可见的。
在继承相关的多态中,调用方法有一个优先级,this.XXX(A)---------->super.XXX(A)---------->this.XXX(super.A)---------->super.XXX(super.A).
看到一个很经典的例子,在此为大家简单解释一下结果。
// A类:父类public class A { public String show(D obj) { return ("A and D"); } public String show(A obj) { return ("A and A"); } }// A类的儿子public class B extends A{ public String show(B obj){ return ("B and B"); } public String show(A obj){ return ("B and A"); } } //B类的儿子public class C extends B{}//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
结果分析:
调用链:this.XXX(@)---------->super.XXX(@)---------->this.XXX(super.@)---------->super.XXX(super.@).
1、2、3中都是A自己的引用,A自己的实例对象。this代表A.
1.a1.show(b):A类中只有show(D)、show(A)方法。this.XXX(@)不存在,因为A类只有Object父类,super.XXX(@)不存在;
this.XXX(super.@),B类的父类是A类,在A类有show(A)方法,所以调用A类中的showA()
2.a1.show(c):同1说明.区别在于c类时b的子类,b时A的子类.A中不含有this.(C)和this.(B),但是c也是A的子类,所以调用A的showA()
3.a1.show(d):直接调用this.XXX(@)
4、5、6中都是A的引用,B的实例.实例对象决定调用谁的成员方法.this代表B
4.a2.show(b):this.XXX(@)存在,但是在父类A中没有此方法,父类的引用对此方法不可见.super.XXX(@)也不存在;
this.XXX(super.@)存在:在b中定义了show(A)方法,所有调用B类中的show(A)方法
5.a2.show(c):this.XXX(@)不存在,super.XXX(@)不存在,this.XXX(super.@)存在,b中有show(B),show(A),都是C的父类,调用哪个呢?同4
通过上述例子,应该差不多了解具体的调用过程和规则了.6,7,8,9在此不多说了.
望指正,谢谢.
- Java基础_多态
- java基础<多态>
- java基础_04_多态
- java基础_多态
- java基础:多态
- Java 基础 polymorphism(多态)
- Java基础----多态
- Java基础--多态
- Java基础---多态
- Java基础--多态
- java基础--接口、多态
- JAVA基础----多态
- java基础回顾----多态
- Java基础(7):多态
- java基础<八>-------多态
- 6 Java基础 多态
- java 基础 ->多态
- 03.Java 基础 - 多态
- Packet for query is too large
- java中,使用zxing生成二维码
- 习题课第一次作业:2、重建二叉树
- 火材人搭桥小游戏
- 网站
- java基础-多态
- 超像素(Superpixel)理解
- TCP三次握手及其背后的缺陷
- hdoj1395(暴力求解)
- iptables防火墙原理详解
- 【HDU 5895】【指数循环节 矩阵 快速幂 逆元 推公式】Mathematician QSC 由递推式推公式
- C语言:单链表的反转
- 欧拉函数
- 【转】关于GetMemory()函数