首先 我想说 这个程序不是我的 但是我觉得这个能很好的反应出JAVA的多态,使大家能更好的理解JAVA多态.对大家的学习有点帮助。由于是COPY过来的 就不要积分了哈哈
希望大家能从中学到些什么。 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...{}
以下输出结果是什么?
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.sho(b)); ①
System.out.println(a1.sh(c)); ②
System.out.println(a1.sho(d)); ③
System.out.println(a2.sh(b)); ④
System.out.println(a2.sho(c)); ⑤
System.out.println(a2.sh(d)); ⑥
System.out.println(b.s(b)); ⑦
System.out.println(b.sh(c)); ⑧
System.out.println(b.show(d)); ⑨
三)答案
① 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
1 a1.shows(b),在A中没有含有B类参数的方法,但是含有A类参数的方法,根据子类对象父类可用的原则,所以调用方法
public String show(A obj)...{return ("A and A");}
2 a1.show(c),C类是B类的子类,而B类又是A类的子类,所以C类对象可以当制作A类对象使用。结果同上。
3 a1.show(d),根据参数类型直接调用A中的方法 public String show(D obj)...{ return ("A and D"); }
4 a2.show(b),a2本来是一个B对象,但是将其赋给了A类变量,所以a2只保留了与父类A同名的属性和方法。a2.show(b)调用B类中的保留的与父类同名同参方法
public String show(A obj)...{ return ("B and A"); }
5 a2.show(c),B类的保留方法中没有C类参数方法,但是有含有C的父类A的参数方法,所以调用的方法
public String show(A obj)...{ return ("B and A"); }
6 a2.show(d),调用的是A类中的
public String show(D obj)...{ return ("A and D"); }
7 b.show(b),调用B类中的
public String show(B obj)...{ return ("B and B"); }
8 b.show(c),B类中没有C类参数的方法,但是有B类参数的方法,所以调用方法 public String show(B obj)...{ return ("B and B"); }
9 b.show(d),解释同8
P.S. 关于6中是否有权限问题 请大家自己试试为什么不调用public String show(A obj) 而调用 public String show(D obj) 可能是D的权限比A大吧….(个人理解)
希望大家能从中学到些什么。 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...{}
以下输出结果是什么?
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.sho(b)); ①
System.out.println(a1.sh(c)); ②
System.out.println(a1.sho(d)); ③
System.out.println(a2.sh(b)); ④
System.out.println(a2.sho(c)); ⑤
System.out.println(a2.sh(d)); ⑥
System.out.println(b.s(b)); ⑦
System.out.println(b.sh(c)); ⑧
System.out.println(b.show(d)); ⑨
三)答案
① 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
1 a1.shows(b),在A中没有含有B类参数的方法,但是含有A类参数的方法,根据子类对象父类可用的原则,所以调用方法
public String show(A obj)...{return ("A and A");}
2 a1.show(c),C类是B类的子类,而B类又是A类的子类,所以C类对象可以当制作A类对象使用。结果同上。
3 a1.show(d),根据参数类型直接调用A中的方法 public String show(D obj)...{ return ("A and D"); }
4 a2.show(b),a2本来是一个B对象,但是将其赋给了A类变量,所以a2只保留了与父类A同名的属性和方法。a2.show(b)调用B类中的保留的与父类同名同参方法
public String show(A obj)...{ return ("B and A"); }
5 a2.show(c),B类的保留方法中没有C类参数方法,但是有含有C的父类A的参数方法,所以调用的方法
public String show(A obj)...{ return ("B and A"); }
6 a2.show(d),调用的是A类中的
public String show(D obj)...{ return ("A and D"); }
7 b.show(b),调用B类中的
public String show(B obj)...{ return ("B and B"); }
8 b.show(c),B类中没有C类参数的方法,但是有B类参数的方法,所以调用方法 public String show(B obj)...{ return ("B and B"); }
9 b.show(d),解释同8
P.S. 关于6中是否有权限问题 请大家自己试试为什么不调用public String show(A obj) 而调用 public String show(D obj) 可能是D的权限比A大吧….(个人理解)