关于覆盖和重写的思考[原创]

2关于覆盖:
        首先覆盖是继承关系的基础上的一种语法现象。
        覆盖的本质是改变基类的方法的处理。
        为什么会出现继承呢?因为想让子类拥有基类的方法。如果子类覆盖这些方法的时候改变了可视性(private,public),
        那么会怎么样呢?思考:如果子类1把基类的public方法修改成private,那么其子类就看不到这个方法了,对吧。这与
        继承的宗旨是不符的。试着想想,如果允许缩小可视范围的话,一个定义了丰富方法的基类,子类继承了他的方法,有一天
        他的子类却什么方法都没有了(所有方法都被缩小可视范围了),这个子类就没有任何意义了,和基类也脱离关系了。
        所以,第一点就是子类覆盖方法的时候不能缩小该方法的可视范围。


        其次,什么样的方法才叫覆盖了基类的方法呢?这里很有必要说一下,本来挺简单的东西,就是方法名,参数,返回值
        类型都相同的方法。如果子类方法的方法名,参数名都和基类的某个方法一样,那么没有选择,它就是覆盖,这回他要
        遵守覆盖的全部规矩。如果参数不同,那么还有的商量,它是重载。

        最后,但这就够了吗?加上第一点。还有就是不能自己添加throws.基类有,子类的方法可以去掉仍然是覆盖。
        为什么允许子类可以去掉throws呢?但是基类方法没有throws的时候却不能添加throws呢?
        想想这是为什么?其实很简单,就是为了不让已经写完的程序出错。
         class parent{
                 public void f() throws Exception{... }
         }
        class child extends parent{
             public void f() {... }
        }
        child obj = new child();
        parent hold = obj.
        try{
                hold.f();//看,子类方法去掉也不会出错。用不着修改所有程序代码
        }catch( Exception e){}

        但是,如果是这样的,就会出错了:
         class parent{
                 public void f() {... }
         }
        class child extends parent{
             public void f() throws Exception{... }//java编译器不允许。
        }
        child obj = new child();
        parent hold = obj.
        hold.f();//本来是不跑出异常,子类覆写了,当然掉用子类方法,这回抛出异常了。而设计的时候是按照没有跑出异常
                //设计的。所以这个子类创造出来了之后需要修改代码,加上try{}catch{}代码
                //所以java编译器不允许子类在基类方法没有throws,添加throws。
        
3,什么叫重载,就是又定义了一个新的方法,和原来的方法差不多,又必须有些不同。哪差不多呢?就是同一个方法名称。
        其他的都可以不同。哪些必须有些不同?最起码参数得不同。
        可以是一个类里定义了不少这样的方法,也可以是在子类里定义了这样的方法。
        参数如果不同就别提什么重载了,其他什么都可以不同,也可以相同。不就是又定义了一个方法吗?没有什么新鲜的。


4,覆盖或者重载的调用问题。
        调用一个方法他使用的到底是哪个方法呢?对于覆盖来说,既然子类覆盖了基类的方法,当然子类对象的该方法调用的
        就是刚刚覆盖的方法了。要不然,覆盖干啥?
        对于重载,既然参数不同,那么肯定要根据参数来定具体掉哪个方法了!
                重载还有中情况就是传入的参数有几个方法都适用,例如f(1) , f(byte a) ,f( int a) ,f(float a),f(double a)
                都是可以的,那么调用谁? 调用参数级别最高的,
                        例如传入1,调用整数里级别最高的,f( int a)
                            传入1.1 调用实数里级别最高的,f( double a   
                (和官场很相似啊!呵呵)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值