子类重写(覆盖)父类的方法必须满足的条件+构造方法和方法的重载和重写

  • 父类中的方法在子类中必须可见,即子类继承了父类中的该方法(可以显式的使用 super 关键字来访问父类中的被重写的方法),如果父类中的方法为 private 类型的,那么子类虽能继承,但无法覆盖

  • 子类和父类的方法必须是实例方法,如果父类是 static 方法而子类是实例方法,或者相反都会报错。如果父类和子类都是 static 方法,那么子类隐藏父类的方法,而不是重写父类方法

  • 子类和父类的方法必须要具有相同的函数名称、参数列表,并且子类的返回值与父类相同或者是父类返回类型的子类型(jdk1.5 之后)。如果方法名称相同而参数列表不同(返回类型可以相同也可以不同),那么只是方法的重载,而非重写。如果方法名称和参数列表相同,返回值类型不同,子类返回值类型也不是父类返回值类型的子类,编译器就会报错

  • 子类方法的访问权限不能小于父类方法的访问权限(可以具有相同的访问权限或者子类的访问权限大于父类)。访问权限由高到低:public、protected、包访问权限、private。如果子类方法的访问权限低于父类,则编译器会给出错误信息

  • 子类方法不能比父类方法抛出更多的编译时异常(不是运行时异常),即子类方法抛出的编译时异常或者和父类相同或者是父类异常的子类。当然,子类也可以不抛出异常,或者抛出 RuntimeException 异常

  • 不能重写被标识为 final 的方法。final 方法可以被继承,但不能被重写。一个方法如果被 final 修饰就意味着这个方法不会被改动

构造方法
注:默认的构造方法的访问权限是跟随class的访问权限,一个构造方法,既没有调用 super() 也没有调用 this(),编译器会默认插入一个调用到父类构造方法中,而且不带参数。
super关键字的用法:1.调用父类构造方法  2.调用父类的方法
值得注意的是:1.super()必须放在构造方法的最顶端   2. 不能在构造方法以外的任何方法内调用构造方法。

方法的重写(覆盖)、与重载
方法重写:
    重写方法在写法上与原方法大致相同,但访问权限不允许缩小
    被static、final、private修饰的方法不能被重写(静态绑定)

方法重载:
​ 注:子类可以重载父类的方法,静态方法可以被重载
重写和重载的不同:

    方法重写要求参数列表必须一致,而方法重载要求参数列表必须不一致。
    方法重写要求返回类型必须一致,方法重载对此没有要求。

    面向的方法-> 方法重写只能用于子类覆盖父类的方法,方法重载用于同一个类中的所有方法(包括从父类中继承而来的方法)。

    方法重写对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制。
    父类的一个方法只能被子类重写一次,而一个方法可以在所有的类中可以被重载多次。

 

你可能感兴趣的:(Java)