重载和重写
重写:对于同一个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");
}