您的位置:首页 > 编程语言 > Java开发

Java多态的理解

2017-06-22 16:02 218 查看
重载和重写

重写:对于同一个class内。同一个方法的名字,参数不同或者返回类型不同

class Parent{
void method(int a){
//todo
}
void method(int a,int b){
//todo
}
}


重载:对于子类与父类。

子类重新实现了父类的方法(参数与返回值类型必须相同)

class Parent{
void p1(){};
void p2(){};
Object op1;
}
class Child extends Parent{
//重写父类的方法
void p1(){};
//子类的独有属性
void c1(){};
Object oc1;
}


实例化方法:

Parent p = new Child ();

那么p的具体实现是怎么样的,请理解以下内容



问题

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.show(b));  // ①
System.out.println(a1.show(c));  // ②
System.out.println(a1.show(d));  // ③
System.out.println(a2.show(b));  // ④
System.out.println(a2.show(c));  // ⑤
System.out.println(a2.show(d));  // ⑥
System.out.println(b.show(b));   // ⑦
System.out.println(b.show(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

还有的注意的地方就是如果在类内 找不到method(Object),会将Object转换成Object的父类再查找是否有对应的方法,即method((super)Object)

所以上面的第4个 a2.show(b) 的执行过程:

1.在可调用的两个方法内没有匹配的。上面例子中的a2可引用到的内容为以下三个方法

public String show(A obj)...{  //重写了父类的show(A)
return ("B and A");
}
public String show(D obj)...{  //继承自父类
return ("A and D");
}


2.将参数b转换为b的父类A,即a2.show( (A)b ),这回就有匹配的方法可以调用了

public String show(A obj)...{  //重写了父类的show(A)
return ("B and A");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 多态