进一步理解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):
(编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
