Java多态特性
来源:互联网 发布:华三交换机进入端口 编辑:程序博客网 时间:2024/06/04 19:58
都知道多态是OO的一个特性。Java当中多态是靠接口实现和继承来实现,可分为编译时多态和运行时多态。
编辑时多态意指在编译时期就已经知道需要执行的具体是同名方法中的哪一个,如
Father f = new Father();
f.say();
运行时多态意指只有在运行时才知道需要执行的具体是同名方法中的哪一个,如
Father s = new Son();
s.say("Hello");
1. 接口实现多态:
interface A {public String sayHello();}class B implements A{public String sayHello(){return "Hello B";}}class C implements A{public String sayHello(){return "Hello C";}}
在调用时,用
A a1 = new B();
A a2 = new C();
这种方式来产生实例,用a1.sayHello()或a2.sayHello()时,就是多态的体现。
2. 继承实现多态:
Class A:
public class A { public String show(D obj) { return ("A and D"); } public String show(A obj) { return ("A and A"); }}
Class B:
public class B extends A{ public String show(B obj) { return "B and B"; } public String show(A obj) { return "B and A"; }}
Class C 和 D:
测试类:public class C extends B{}
public class D extends B{}
public class PolymorphismTest { 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) " + a1.show(b)); System.out.println("a1.show(c) " + a1.show(c)); System.out.println("a1.show(d) " + a1.show(d)); System.out.println("a2.show(b) " + a2.show(b)); System.out.println("a2.show(c) " + a2.show(c)); System.out.println("a2.show(d) " + a2.show(d)); System.out.println("b.show(b) " + b.show(b)); System.out.println("b.show(c) " + b.show(c)); System.out.println("b.show(d) " + b.show(d)); }}
输出结果:
这种在调用时,用父类作为类型声明,具体实例new的时候new的是子类,亦属多态体现。a1.show(b) A and Aa1.show(c) A and Aa1.show(d) A and Da2.show(b) B and Aa2.show(c) B and Aa2.show(d) A and Db.show(b) B and Bb.show(c) B and Bb.show(d) A and D
面对多态时,JVM方法调用优先级:
this.method(O), super.method(O), this.method((super)O), super.method((super)O)
按照这个顺序,必然能得到正确的JVM调用结果。
比如a2.show(b), this指的是class A,因为声明为A类,那么
1. this.method(O), 它找 A.show(B),结果没有
2. super.method(O), A类的super类是Object,显然没有Object.show(B)方法
3. this.method((super)O), 它找 A.show((super)B), 既是A.show(A),而该方法A类中有,然检查该方法是否被具体实现类(这里new的对象是B)重写overriding,如果有,调用overriding方法,即B.show(A)方法,所以打印"B and A"
注意,第三步中(super)O中是一个递归,它按照继承类实现回溯,比如如果调用的是a2.show(c),第三步时,它先找A.show((super)C), 即 A.show(B),没找到,再找A.show((super)B),即 A.show(A),而A.show(A)被B.show(A)重写,a2是B的具体实例,于是结果实际调用时B.show(A)方法,于是打印“B and A"
这里注意多态与重写、重载区别:
重写overriding:
子类中把父类同名、同参方法再实现一遍
重载:
子类中实现与父类中方法同名、异参方法
所以刚才这个例子中,既包含了多态,又包含了重写。
这里有个重写的陷阱例子:
public class Base{ int i=99;}
public class Child extends Base{ int i =-1; public static void main(String[] args]){ Base b = new Child(); System.out.println(b.i);}}
如果把这个当作重写,就掉入陷阱了。重写是方法级的,变量无法override,所以输出是99.
- Java多态特性
- java多态特性
- Java特性多态
- java 多态特性
- JAVA的多态特性
- JAVA多态成员特性
- java多态的特性
- java的多态特性
- java 多态的特殊特性
- JAVA特性多态之覆盖
- java特性之多态
- Java特性之多态详解
- JAVA四大特性之多态
- 大脑烧糊的java多态特性!
- Java的特性—封装、继承和多态
- java三大特性之继承和多态
- java四大特性理解(封装继承多态抽象)
- Java多态特性:重载和覆写的比较
- Java反射效率
- java反射机制基础详解(转)
- transient, volatile, strictfp
- Difference between Serializable and Externalizable in Java Serialization
- C++箴言:绝不在构造或析构期调用虚函数
- Java多态特性
- web程序请求限制
- Collection类区别
- How to disable certain HTTP methods (PUT, DELETE, TRACE and OPTIONS) in JBOSS7
- POJ-2492-A Bug's Life
- 在eclipse上安装 Marketplace Client
- Java使用qqwry.dat根据IP地质获取城市信息
- [Android] Android软键盘的隐藏显示研究
- 通过 iframe 实现 xss(Enabling cross-site scripting XSS via an iframe)