面向对象,多态
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 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的
封装是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
继承是指可以让某个类型的对象获得另一个类型的对象的属性的方法。
所谓多态就是指一个类实例的相同方法在不同情形有不同表现形式。
封装和继承可以说是为多态做准备,这里主要说下多态,下面是一个很古老的例子
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的
相关文章推荐
- JavaSE review -- 面向对象、封装、继承、多态、抽象
- 面向对象——多态的理解
- Java笔记(十五)……面向对象IV多态(polymorphism)
- 面向对象的三个重要特性之二(多态)
- 初学Python的学习笔记8----面向对象、数据封装、访问限制、继承和多态
- java语言基础(36)——面向对象(多态的代码体现以及成员之间的访问关系)
- 黑马程序员-面向对象(封装,继承,多态)
- C# 面向对象之多态
- Java基础——面向对象(封装、继承、多态)
- 面向对象三大特性-多态
- 编程基础-面向对象-多态
- JAVA菜鸟(三)面向对象之封装,继承,多态(下)
- 47_面向对象_20_多态_内存分析深化(模拟servlet中方法的调用)
- PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
- 面向对象三大特性之多态
- 关于面向对象“多态”的理解
- 从Java到Go面向对象--多态
- 学习PHP面向对象(七) 多态
- Python 学习笔记 - 面向对象(封装,继承和多态)
- OC面向对象—多态