重写与重载

<p>重写方法的规则以下:</p> <p>1. 参数列表:必须与被重写方法的参数列表彻底匹配。 <br />2. 返回类型:必须与超类中被重写的方法中声明的返回类型或子类型彻底相同 <br />3. 访问级别:必定不能比被重写方法强,能够比被重写方法的弱。 <br />4. 非检查异常:重写方法能够抛出任何非检查的异常,不管被重写方法是否声明了该异常。 <br />5. 检查异常:重写方法必定不能抛出新的检查异常,或比被重写方法声明的检查异常更广的检查异常 <br />6. 不能重写标志为final,static的方法 <br />重载方法的规则: <br />1. 参数列表:被重载的方法必须改变参数列表。 <br />2. 返回类型:能够改变返回类型。 <br />3. 修饰符:能够改变修饰符 <br />4. 异常:能够声明新的或者更普遍的异常。</p> <ol> <li><strong>class</strong> Animal {&#160;&#160; </li> <li><strong>public</strong> <strong>void</strong> eat(){&#160;&#160; </li> <li>&#160;&#160;&#160; }&#160;&#160; </li> <li>}&#160; </li> </ol> <p>如下列出对于Animal的eat方法各类重写重载实例,根据以上列出的规则,判断其是否合法(如下的方法都属于Animal的子类Horse的方法): <br />1. private void eat(){}&#160; 不能经过编译,非法重写,访问修饰符限制性变强;不属于重载,由于参数列表没有发生改变 <br />2. public void eat() throw RuntimeException{}&#160; 能经过编译,属于重写,重写方法能够抛出任何非检查异常。 <br />3. public void eat() throw IOException{}&#160; 不能经过编译,非法重写,重写方法必定不能抛出新的检查异常,或比被重写方法声明的检查异常更广的检查异常;不属于重载,参数列表必须发生变化才属于重载 <br />4. public void eat(String food){}&#160; 能经过编译,不是重写;合法重载,由于参数列表发生改变了。 <br />5. public String eat(){}&#160; 不能经过编译,不是重写,由于其返回类型;不是重载,由于参数列表没有发生改变。 <br />6. public String eat(int n){} 能够经过编译,不是重写;是重载,首先参数列表必须发生变化,返回类型能够发生改变。</p> <p>对父类被重写的方法作一个变更:</p> <ol> <li><strong>class</strong> Animal {&#160;&#160; </li> <li><strong>public</strong> Animal eat() <strong>throws</strong> IOException{&#160;&#160; </li> <li><strong>return</strong> <strong>null</strong>;&#160;&#160; </li> <li>&#160;&#160;&#160; }&#160;&#160; </li> <li>}&#160; </li> </ol> <p>7.&#160; public Animal eat(){return null;}&#160; 能够经过编译,合法重写,能够不抛出异常,只要不抛出新的异常或更普遍的异常就能够。 <br />8.&#160; public Animal eat() throws FileNotFoundException{return null;} 能够经过编译,是重写,属于子类的非检查异常。 <br />9.&#160; public Animal eat() throws Exception{}&#160; 不能够经过编译,非法重写,抛出了更普遍的异常。 <br />10.&#160; public Horse eat() {} 能够经过编译,是重写,由于返回类型能够是被重写的返回类型的子类。</p> <p>1&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 重载(Overloading) <br />(1)&#160;&#160;&#160;&#160;&#160;&#160; 方法重载是让类以统一的方式处理不一样类型数据的一种手段。多个同名函数同时 <br />存在,具备不一样的参数个数/类型。重载Overloading是一个类中多态性的一种表现。 <br />(2)&#160;&#160;&#160;&#160;&#160;&#160; Java的方法重载,就是在类中能够建立多个方法,它们具备相同的名字,但具 <br />有不一样的参数和不一样的定义。调用方法时经过传递给它们的不一样参数个数和参数类型 <br />来决定具体使用哪一个方法, 这就是多态性。 <br />(3)&#160;&#160;&#160;&#160;&#160;&#160; 重载的时候,方法名要同样,可是参数类型和个数不同,返回值类型能够相同 <br />也能够不相同。没法以返回型别做为重载函数的区分标准。</p> <p>2&#160;&#160;&#160;&#160; 重写(Overriding) <br />(1)&#160;&#160;&#160; 父类与子类之间的多态性,对父类的函数进行从新定义。若是在子类中定义某 <br />方法与其父类有相同的名称和参数,咱们说该方法被重写 (Overriding)。在Java中, <br />子类可继承父类中的方法,而不须要从新编写相同的方法。但有时子类并不想原封不 <br />动地继承父类的方法,而是想做必定的修改,这就须要采用方法的重写。方法重写又 <br />称方法覆盖。 <br />(2)&#160;&#160;&#160; 若子类中的方法与父类中的某一方法具备相同的方法名、返回类型和参数表, <br />则新方法将覆盖原有的方法。如需父类中原有的方法,可以使用super关键字,该关键 <br />字引用了当前类的父类。 <br />(3)&#160;&#160;&#160; 子类函数的访问修饰权限不能少于父类的;</p> <p>总结:重载和重写(覆盖)。&#160; <br />方法的重写Overriding和重载Overloading是Java多态性的不一样表现。重写 <br />Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性 <br />的一种表现。若是在子类中定义某方法与其父类有相同的名称和参数,咱们说该方法 <br />被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而 <br />言,父类中的定义如同被“屏蔽”了,并且若是子类的方法名和参数类型和个数都和 <br />父类相同,那么子类的返回值类型必须和父类的相同;若是在一个类中定义了多个同 <br />名的方法,它们或有不一样的参数个数或有不一样的参数类型,则称为方法的重载 <br />(Overloading)。Overloaded的方法是能够改变返回值的类型。也就是说,重载的返回 <br />值类型能够相同也能够不一样。</p>函数

相关文章
相关标签/搜索