问题:
子类能否重载父类的类型?
答:
完全可以,先看一个例子,接下来会有另一种情况
public class Son extends Father{
public void test(int i){
System.out.println("This is from Son class and the number is " +i);
}
public static void main(String args[]){
Son son = new Son(); //这里要注意,接下来在这里做文章会发生改变
son.test();
son.test(1);
}
}
class Father{
public void test(){
System.out.println("This is from Father class");
}
}
输出结果为
This is from Father class
This is from Son class and the number is 1
那么这是可行的。现在书上说,重载是静态编译时完成的,与动态时的重写确定方法不同,那么我就用父类来绑定子类调用方法来试验一下什么时候子类重载父类的方法可以成功。
class TestSon extends Test{
protected void fun(int i) {
System.out.println("Son!");
}
}
public class Test {
protected void fun(){
System.out.println("Father!");
}
public static void main(String[] args) {
Test t = new TestSon();
t.fun();/这里体现”静态“的关键,体现在两点:1.eclipse开启了自动提示时,仅仅有一个fun()的选项,而fun(int)的选项没有。2.这里静态编译时,t是Test类型,并且编译时仅仅通过寻找重载的可能来确定调用哪一个函数,而重写调用什么函数是动态时确定的,所以这里仅仅判断Test类中写了重载没有,一查找,发现没有,所以确定调用的函数是父类的fun。这里在静态时已经确定使用什么函数了,所以动态时就再没有二次确定,所以子类“重载”没能成功。
TestSon t = new TestSon();
t.fun();
t.fun(1);//这里就能够成功,是因为在静态编译时在声明的类TestSon中寻找,发现有父类的fun与子类重载的fun两个,然后根据函数传递参数类型确定调用哪一个函数。
}
}
这里涉及到多态的jvm实现方式,静态确定在哪一个类中重载哪一个方法,动态确定到底是哪一层的方法,是子类的重写还是父类。