进一步理解Java中的多态概念
多态性有两种: 方法覆盖表现出两种多态性,当对象获得本类实例时,为编译时多态性,否则为运行时多态性,例如: java多态实现 方法的重写overriding和方法的重载overloading是java多态的不同表现。重写overriding是父类和子类之间多态性的一种表现,重载overloading是一个类中多态性的表现。 给出一个具体例子:
class People { public String toString() { return "I am a people!"; } public void eat() { }; public void speak() { }; } class Boy extends People { public String toString() { return "I am a boy!"; } public void fight() { }; public void speak() { }; } class Girl extends People { public String toString() { return "I am a girl!"; } public void sing() { }; public void speak() { }; } public class TestToString { public static void main(String args[]) { People p = new Girl(); System.out.println(p.toString()); } } 运行结果是: I am a girl! p是People的一个引用,但是在运行时因为是Girl对象,所以还是调用了Girl的toString方法
测试题目 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 { } public class Main { 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(a1.show(b)); // 1 System.out.println(a1.show(c)); // 2 System.out.println(a1.show(d)); // 3 System.out.println(a2.show(b)); // 4 System.out.println(a2.show(c)); // 5 System.out.println(a2.show(d)); // 6 System.out.println(b.show(b)); // 7 System.out.println(b.show(c)); // 8 System.out.println(b.show(d)); // 9 } } 答案 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 解析 首先,要深刻的理解重写和重载,重写不仅仅包括了函数名称相同,也包括参数类型和返回值类型 其次,深刻理解这句话“当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类重写的方法” 然后,我们在来分析一下这几道题目 问题:你认为B重写了父类A的show方法了吗?如果重写了,重写了几个? 答案:重写了,重写了一个,也就是public String show(A obj),为什么public String show(B obj)不算重写父类方法呢,很简单,因为参数类型不同 举例分析 一、a2.show(b): a2是一个引用变量,类型为A,b是B的一个实例。首先,在类A中找show(B obj),没有找到。于是到A的超类中找,而A没有超类,因此转向了A.this((super)B),(super)B为A,因此在A中找到了show(A obj)的方法,但是由于a2引用的类B的一个对象,B重写了A的show(A obj)方法,因此最终锁定到类B的show(A obj),输出为“B and A” 二、a2.show(c):
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |