重载是一定不允许的。比如
原因在与如果调用时int i = f();可以知道是调用Sub的f()。但是,往往用户不关心返回值。只是f()。这样就无法确定到底是哪个。
覆盖一般情况是不允许的。比如
编译会报错。
但是有办法可以不同(表面上不同)。比如
这样是完全可以的,运行结果
Grain
Wheat
其实也并不难理解,因为子类本身就可以看做是父类。这个是JAVA1.5后引入的一个概念:
协变返回类型
- classSuper{
- voidf(){
- }
- intf(){
- return1;
- }
- }
原因在与如果调用时int i = f();可以知道是调用Sub的f()。但是,往往用户不关心返回值。只是f()。这样就无法确定到底是哪个。
覆盖一般情况是不允许的。比如
- classSuper{
- voidf(){
- }
- }
- classSubextendsSuper{
- intf(){
- return1;
- }
- }
编译会报错。
但是有办法可以不同(表面上不同)。比如
- classGrain{
- publicStringtoString(){
- return"Grain";
- }
- }
- classWheatextendsGrain{
- publicStringtoString(){
- return"Wheat";
- }
- }
- classMill{
- Grainprocess(){//注意返回值
- returnnewGrain();
- }
- }
- classWheatMillextendsMill{
- Wheatprocess(){//注意返回值
- returnnewWheat();
- }
- }
- publicclassCovariantReturn{
- publicstaticvoidmain(String[]args){
- Millm=newMill();
- Graing=m.process();
- System.out.println(g);
- m=newWheatMill();
- g=m.process();
- System.out.println(g);
- }
- }
这样是完全可以的,运行结果
Grain
Wheat
其实也并不难理解,因为子类本身就可以看做是父类。这个是JAVA1.5后引入的一个概念:
协变返回类型