Java中子类重写父类中的方法应注意的问题

若想实现一个合格的重写方法,而不是重载,那么必须同时满足下面的要求:

1.重写规则之一:

重写方法不能比被重写的方法限制有更严格的访问级别。
比如:父类方法是protected访问权限,子类的重写方法可以是public 访问权限。
访问权限:
这里写图片描述

2.重写规则之二:

参数列表必须与被重写方法的相同。
重写有个孪生的弟弟叫重载,也就是后面要出场的,如果子类方法的参数与父类对应的方法不同,那么就是你认错人了,那是重载,不是重写。

3.重写规则之三:

返回类型必须与被重写方法的返回类型相同
父类方法A:void eat(){} 子类方法B:int eat(){} 两者虽然参数相同,可是返回值类型不同,所以不是重写。
父类方法A:int eat(){} 子类方法B:long eat(){} 返回类型虽然兼容父类,但是不同就是不同,所以不是重写。

4.重写规则之四:

重写方法不能抛出新的异常或者比重写方法声明的检查异常更广的检查异常,但是可以抛出更少,更有限或者不抛出异常。

        import java.io.*;
        public class Test {
            public static void main (String[] args) {
               Animal h = new Horse();
               try {
                 h.eat();
               }
               catch (Exception e) {
               }
            }
        }

        class Animal {
          public void eat() throws Exception{
              System.out.println ("Animal is eating.");
              throw new Exception();
          }
        }

        class Horse extends Animal{
           public void eat() throws IOException{
                System.out.println ("Horse is eating.");
                throw new IOException();
           }
        }

这个例子中,父类抛出了检查异常Exception,子类抛出的IOException是Exception的子类,也即是比被重写的方法抛出了更有限的异常,这是可以的。如果反过来,父类抛出IOException,子类抛出更为宽泛的Exception,那么不会通过编译的。
注意:这种限制只是针对检查异常,至于运行时异常RuntimeException及其子类不再这个限制之中。

5.重写规则之五:

不能重写被标识为final的方法

6.重写规则之六:

如果一个方法不能被继承,则不能重写它

    public class Test {
        public static void main (String[] args) {
           //Animal h = new Horse();
           Horse h = new Horse();
            h.eat();
        }
    }

    class Animal {
       private void eat(){
           System.out.println ("Animal is eating.");
       }
    }

    class Horse extends Animal{
       public void eat(){
         System.out.println ("Horse is eating.");
       }
    }

这段代码是能通过编译的,表面上看来违反了第六条规则,但实际上那是一个巧合,Animal类的eat()方法不能被继承,因此Horse类中的 eat()方法是一个全新的方法,不是重写也不是重载,只是一个只属于Horse类的全新的方法!这点让很多人迷惑了,但是也不是那么难以理解。
main()方法如果是这样:
Animal h = new Horse();
//Horse h = new Horse();
h.eat();
编译器会报错,为什么呢?Horse类的eat()方法是public的啊!应该可以调用啊!请牢记,多态只看父类引用的方法,而不看子类对象的方法!
解析:
多态只看父类引用的方法,而不看子类对象的方法!什么意思呢?Animal h=new Horse();这个体现了多态,但是h.eat()只会调用子类重写父类的那个方法,而该demo中因为父类的方法是private的,所以子类无法重写这个方法,也就是子类那个eat()是子类自己新创建的方法,跟父类没有半点关系,所以这时候Animal h=new Horse();会报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苦修的木鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值