java 重载:子类父类 与 多态动态绑定静态重载

问题:

子类能否重载父类的类型?

答:

完全可以,先看一个例子,接下来会有另一种情况

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实现方式,静态确定在哪一个类中重载哪一个方法,动态确定到底是哪一层的方法,是子类的重写还是父类。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值