您的位置:首页 > 其它

面向对象,多态

2017-07-20 11:08 78 查看
面向对象三个特性:封装,继承,多态

封装是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

继承是指可以让某个类型的对象获得另一个类型的对象的属性的方法。

所谓多态就是指一个类实例的相同方法在不同情形有不同表现形式。

封装和继承可以说是为多态做准备,这里主要说下多态,下面是一个很古老的例子

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));
}
}

要想写对这个,只要知道方法调用的优先级

this.show(O),super.show(O),this.show(super(O)),super.show(super(O))

第一个

a1.show(b),A中没有这个方法,那么执行super.show(b),可是A没有父类,所以继续this.show(super(b)),A是B的父类,所以等同于this.show(A),因此输出A and A

第二个

a1.show(c),同样A中没有这个方法,执行super.show(c),可是A没有父类,所以继续this.show(super(c)),B是C的父类,所以等同于this.show(b),这等同于第一个了,后面的就不说了,输出A and A

第三个

a1.show(d),方法中有,所以直接输出A and D

第四个

a2.show(b),A没有这个方法,执行super.show(b),可是A没有父类,所以继续执行this.show(super(b)),A是B的父类,所以等同于this.show(A),注意此时和第一个不一样了,因为a2的实例是B,并且B覆盖了show(A)这个方法,所以执行B里的方法,输出B and A

第五个

a2.show(c),A没有这个方法,执行super.show(c),可是A没有父类,所以继续执行this.show(super(c)),B是C的父类,所以等同于a2.show(B),这等同于第四个了,后面的就不说了,输出B and A

第六个

a2.show(d),A类有这个方法,虽然a2的实例是B,但是B类没有这个方法,所以使用A类的show(d)方法,输出A and D

第七个

b.show(b),B类有这个方法,所以直接输出B and B

第八个

b.show(c),B类没有这个方法,所以执行super.show(c),A是B的父类,所以等同于a.show(c),也没有这个方法,所以执行b.show(super(c)),B是C的父类,所以等同于b.show(b),B类有这个方法,所以输出B and B

第九个

b.show(d),B类中没有这个方法,所以执行super.show(d),A是B的父类,所以等同于a.show(d),A类有这个方法所以输出A and D

以上是9个题的答案及分析,只要记住执行顺序,这种题都可以迎刃而解,唯一可能出错的就是在于a2上,这里面a2是B的引用,所以先找B里面的方法,有的话执行B的,没有的话才执行A的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: