1.基于繼承
- 覆蓋
子類覆蓋父類的方法,實(shí)現(xiàn)多態(tài) - 抽象
子類實(shí)現(xiàn)父類的抽象方法,實(shí)現(xiàn)多態(tài)
abstract 不能與private、static、final或native并列修飾同一個(gè)方法
2.基于接口
接口里面所有的變量都是public static final
所有方法都是public abstract,public abstract可以省略
不能有非abstract方法和非public變量,否則會(huì)報(bào)錯(cuò),
3.案例
摘自http://www.cnblogs.com/chenssy/p/3372798.html
public class A {
public String show(D obj) {
return ("A and D");
}
public String show(A obj) {
return ("A and A");
}
}
public class B extends A{
public String show(B obj){
return ("B and B");
}
public String show(A obj){
return ("B and A");
}
}
public class C extends 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));
}
}
運(yùn)行結(jié)果:
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
我來理解下4、5和9:
a2.show(b)
A a2 = new B();a2.show(b);
調(diào)用的是a2的方法,因?yàn)閍2向上轉(zhuǎn)型為A,那么show只能調(diào)用類A的方法,A里有參數(shù)為A和D兩種,所以a2.show(b)對(duì)應(yīng)于A.show(B)對(duì)應(yīng)于A.show(A),由于多態(tài)性,最終調(diào)用的是B.show(A)即B and A。a2.show(c)
A a2 = new B();a2.show(c);
調(diào)用的是a2的方法,因?yàn)閍2向上轉(zhuǎn)型為A,那么show只能調(diào)用類A的方法,A里參數(shù)有A和D兩種,所以a2.show(b)對(duì)應(yīng)于A.show(C)對(duì)應(yīng)于A.show(B)對(duì)應(yīng)于A.show(A),由于多態(tài)性,最終調(diào)用的是B.show(A)即B and A.b.show(d)
B b = new B();D d = new D();b.show(d);
由于B是A的子類,那么B可以繼承A的所有非private方法,當(dāng)然A的show(D)也在內(nèi),所以,就直接調(diào)用的是A.show(D)即A and D.