JAVA中子类重写父类的方法,怎么写,什么要求

如题所述

1.父类的方法不能降级,同级的话就要覆盖,例如public方法不能在子类中被声明为protected或者private(子类重载除外),否则会有

Cannot reduce the visibility of the inherited method from Father的编译错误。

2.父类的方法可以任意升级,但升级只有两种方式,要么覆盖,要么重载,覆盖就是方法体完全一样,重载则是参数必须改变,方法名称不变。


import java.lang.reflect.Method;  
  
class Father{  
    int a;  
    protected int b = 5;  
    protected void funcpro(){  
        //父类的保护方法,子类能够访问,但子类自身没有  
        System.out.println("father funcpro");  
    }  
    public void funcpub(){  
        //父类公有方法,子类直接继承  
    }  
    private void funcpri(){  
        //父类私有方法,子类不可见  
    }  
}  
public class TestOveride extends Father {  
  
    /** 
     * @param args 
     */  
    //父类保护方法的重写  
//  public void funcpro(){  
//      //子类自己可以这样定义,将会覆盖父类protected方法  
//      System.out.println("子类的func方法");  
//  }  
  
//  protected void funcpro(){  
//  //ok  
//}  
      
//  public short funcpro(){  
//      //illegal    父类的protected和public方法在子类中是可见的,试想一下,如果编译器认为这个方法体正确,  
        //那么子类调用funcpro的时候究竟调用哪个呢?这样没有能构成重载  
//  }  
  
//  private void funcpro(){  
//      //illegal  
//  }  
    
    private void funcpro(int a){  
        //这是方法重载,不会报错  
        System.out.println("sun funcpro");  
    }  
  
    //父类公有方法的重写  
  
//  private void funcpub(){  
//      //illegal:Cannot reduce the visibility of the inherited method from Father   
//  }  
      
//  protected void funcpub(){  
//      //illegal  Cannot reduce the visibility of the inherited method from Father  
//  }  
      
//  public void funcpub(){  
//      //ok  
//  }  
      
//  public int funcpub(){  
//      //illegal 和父类的返回值不匹配  
//  }  
  
//  public int funcpub(int i){  
//      //ok 子类构成重载  
//      return 1;  
//  }  
  
    //父类私有方法的重写  
  
//  public void funcpri(){  
//      //ok  
//  }  
      
//  protected void funcpri(){  
//      //ok  
//  }  
  
//  private void funcpri(){  
//      //ok  
//  }  
      
    public static void main(String[] args) {  
        // TODO Auto-generated method stub  
        TestOveride testOveride = new TestOveride();  
        Class class1 = testOveride.getClass();        
        try {  
            Method[] methods = class1.getMethods();  
            System.out.println("子类中的所有方法:");  //可以看到,并没有父类的funcpro方法  
            for(Method m:methods){  
                System.out.println(m);  
            }  
            System.out.println("子类调用父类的protected 方法:");  
            testOveride.funcpro();  
            System.out.println("子类调用自己的func方法:");  
            testOveride.funcpro(1);  
            System.out.println("子类调用父类的字段");  
            System.out.println(testOveride.b);  
        }catch(Exception e){  
            e.printStackTrace();  
        }  
  
    }  
  
}

追问

如果父类是double f(double x.double y)
那子类是double f(int x.int y) 可以吗

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-06-18
只要保证子类与父类中方法原型一致、返回类型和访问修饰符不低于父类就行了,不需要任何关键字
public class Base(){
public void print(){

System.out.println("这是Base类的方法!");

}
}

public class Sub extends Base(){

public void print(){

System.out.println("这是Sub类重写后的方法!");

}
}追问

如果父类是double f(double x.double y)
那子类是double f(int x.int y) 可以吗

如果父类是double f(double x.double y)
那子类是double f(int x.int y) 可以吗

追答

不可以,参数必须一致,访问修饰符和返回值不低于父类

追问

那第七题题目中子类方法重新错误?

追答

第七题应该构成了重载,即方法名相同,参数列表不同,不是重写!

第2个回答  2015-06-18
父类:

public int getCount(String a,String b) ;
子类:
@Override
public int getCount(String a,String b) {
。。。。。。

}
方法名,参数类型,个数,返回值类型都要一样
访问级别不能降低
比如父类是public,子类不能是private追问

如果父类是double f(double x.double y)
那子类是double f(int x.int y) 可以吗

追答

不可以的

这些问题如果不懂可以装一个eclipse之类的,把你想的代码写上去,看看能不能编译通过就可以了

第3个回答  2015-06-18
extends 是继承的 关键字 重写 什么方法的时候 只需要在子类 中直接写出 父类的方法名字 然后 alt+? 就出来这个是简单方法 子类从写的时候 权限 需要注意下 子类的 权限 不能小于父类的追问

子类重写方法时,参数类型能变吗

如果父类是double f(double x.double y)
那子类是double f(int x.int y) 可以吗

这样行吗

第4个回答  2015-06-18
@Override追问

如果父类是double f(double x.double y)
那子类是double f(int x.int y) 可以吗

追答

那叫重载

追问

这是方法重写啊

我想问 子类参数类型能变吗

就像上面一样

追答

不能,变了就是重载了,不变才是重写

追问

那题目中子类重写方法错误?

追答

嗯,红笔标注错了~!

追问

呃 麻烦说一下哪里错了

追答

方法名一样,参数列表不一样就是重载;方法名一样,参数列表一样才叫重写~!

追问

哦 我知道了 谢谢您

那可是为啥输出是15.0和8.0?

≥﹏≤希望您帮帮我

追答

第一个3乘以5等于15,return转double,等于15.0;
第二个3.0加5.0等于8.0!!!

本回答被提问者采纳