java啥是方法重写的语法规则?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java啥是方法重写的语法规则?相关的知识,希望对你有一定的参考价值。
例子
一、方法的重写。1、重写只能出现在继承关系之中。当一个类继承它的父类方法时,都有机会重写该父类的方法。一个特例是父类的方法被标识为final。重写的主要优点是能够定义某个子类型特有的行为。
class Animal
public void
eat()
System.out.println ("Animal is eating.");
class Horse extends Animal
public void eat()
System.out.println ("Horse is
eating.");
2、对于从父类继承来的抽象方法,要么在子类用重写的方式设计该方法,要么把子类也标识为抽象的。所以抽象方法可以说是必须要被重写的方法。
3、重写的意义。
重写方法可以实现多态,用父类的引用来操纵子类对象,但是在实际运行中对象将运行其自己特有的方法。
public class Test
public static
void main (String[] args)
Animal h = new Horse();
h.eat();
class Animal
public void eat()
System.out.println ("Animal is
eating.");
class Horse extends
Animal
public void
eat()
System.out.println ("Horse is eating.");
public void
buck()
一个原则是:使用了什么引用,编译器就会只调用引用类所拥有的方法。如果调用子类特有的方法,如上例的h.buck();
编译器会抱怨的。也就是说,编译器只看引用类型,而不是对象类型。
4、重写方法的规则。
若想实现一个合格重写方法,而不是重载,那么必须同时满足下面的要求!
重写规则之一:重写方法不能比被重写方法限制有更严格的访问级别。
(但是可以更广泛,比如父类方法是包访问权限,子类的重写方法是public访问权限。)
比如:Object类有个toString()方法,开始重写这个方法的时候我们总容易忘记public修饰符,编译器当然不会放过任何教训我们的机会。出错的原因就是:没有加任何访问修饰符的方法具有包访问权限,包访问权限比public当然要严格了,所以编译器会报错的。
重写规则之二:参数列表必须与被重写方法的相同。
重写有个孪生的弟弟叫重载,也就是后面要出场的。如果子类方法的参数与父类对应的方法不同,那么就是你认错人了,那是重载,不是重写。
重写规则之三:返回类型必须与被重写方法的返回类型相同。
父类方法A:void
eat() 子类方法B:int eat() 两者虽然参数相同,可是返回类型不同,所以不是重写。
父类方法A:int
eat() 子类方法B:long eat()
返回类型虽然兼容父类,但是不同就是不同,所以不是重写。
重写规则之四:重写方法不能抛出新的异常或者比被重写方法声明的检查异常更广的检查异常。但是可以抛出更少,更有限或者不抛出异常。
例:
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及其子类不再这个限制之中。
重写规则之五:不能重写被标识为final的方法。
重写规则之六:如果一个方法不能被继承,则不能重写它。
比较典型的就是父类的private方法。下例会产生一个有趣的现象。
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的啊!应该可以调用啊!请牢记,多态只看父类引用的方法,而不看子类对象的方法! 参考技术A /**
* 动物类
* @author tanqiao
*
*/
public class Animal
public String eat() throws RuntimeException//抛出运行时异常,修饰为public,无参数
return "食物";
public class Cat extends Animal
@Override
public String eat()
//这就是方法重写了,发生在继承关系中,必须满足与父类的该方法返回值类型,方法名和参数列表一致,而且访问不能比父类更严格,抛出的异常不能比父类更大(throws Exception就会报错)
return "吃鱼";
/**
* 重载,就是你说的复写吧
* @param s 带有了参数,修改了访问修饰,修改了返回值
* @return 结论:只要满足名字一样就是重载,与其他的无关
*/
void eat(String s) //同一个类中
参考技术B java方法的重写 是发生在继承关系里头的,
比如 子类继承父类;
那么它有如下规则:
规则1: 子类的方法的名称及参数必须和父类方法的名称相同
规则2: 子类的方法的返回值类型必须和父类方法的返回值类型相同
规则3: 子类方法的访问权限不能小于父类方法的访问权限;例如:父类的访问权限是protected, 子类不能是private;只能是同级(protected)或者更高级(public)
规则4: 子类方法抛出的异常个数与父类方法的异常个数一致,且子类异常要比父类异常要小;例如:父类异常为Exception ,子类不能是classNotFoundException本回答被提问者采纳 参考技术C java方法重写语法法则:
A、重写规则之一:
重写方法不能比被重写方法限制有更严格的访问级别。
(但是可以更广泛,比如父类方法是包访问权限,子类的重写方法是public访问权限。) B、重写规则之二:
参数列表必须与被重写方法的相同。
重写有个孪生的弟弟叫重载,也就是后面要出场的。如果子类方法的参数与父类对应的方法不同,那么就是你认错人了,那是重载,不是重写。
C、重写规则之三:
返回类型必须与被重写方法的返回类型相同。
D、重写规则之四:
重写方法不能抛出新的异常或者比被重写方法声明的检查异常更广的检查异常。但是可以抛出更少,更有限或者不抛出异常。
E、重写规则之五:
不能重写被标识为final的方法。
F、重写规则之六:
如果一个方法不能被继承,则不能重写它。
Java重写和重载
一、概念
Java中的重写是指子类重新编写父类中对子类可视的方法逻辑,但是方法的形参和返回类型不变,方法的访问修饰符不能严于父类的,即外壳不变、核心重写。
在一个类中,只要满足方法名相同,参数个数或者类型不同,即为方法重载,它与方法的返回类型和访问修饰符没有关系。
二、条件(规则)
方法重写的规则:
1、方法的名字、参数列表和返回类型一定要和父类一样,不能被修改;
2、方法的访问修饰符不能严于父类的,但可以降低限制(比如父类的方法的访问修饰符是protected,那么子类重写的话访问修饰符只能是protected或者public);
3、子类重写的方法一定不能抛出新的检查异常或者抛出比父类更宽泛的检查异常(只能抛出父类原来的异常或者原来异常的子类异常),但是可以抛出非检查异常;
4、父类中static、final以及private修饰的方法,子类不能重写,因为它们都属于静态绑定的,在编译时虚拟机就已经确定了方法所对应的具体对象,即父类;
5、父类的构造方法子类不能重写;
6、对于父类的包访问权限的方法(default),如果子类和父类在同一个包中,则子类可以重写这些方法,如果二者不在同一个包中,则不能重写。
方法重载的规则:
1、方法名一定要相同,方法的参数个数或者参数类型一定要不同;
2、方法的返回值和访问修饰符可以不同,这并不是判断方法重载的条件;
3、方法的抛出异常可以不同;
4、重载是发生在一个类中的,不同类中不存在方法重载;
5、final修饰的方法可以重载。
三、二者的区别
1、方法重写发生于父类和子类之间,而方法重载发生在一个类中;
2、方法重写要求方法名、参数列表、返回值一定要相同,且不能抛出新的检查异常或者抛出比父类更宽泛的检查异常;而方法重载只要求方法名相同,参数个数或者类型不同,对于其他的并没有要求;
3、子类不能重写父类中final、static、private修饰的方法以及父类的构造方法;而上面所说的所有方法都可以在一个类中被重载;
4、重写是父类与子类之间多态的体现,它属于运行时的多态;而方法重载是让类以统一的方式处理不同类型数据的一种手段,多个同名函数同时存在,具有不同的参数个数/类型,通过传递的参数个数和类
型来决定调用哪一个方法,这就是多态性的一种表现,即编译时的多态;
5、运行时的多态是指在运行的时候,通过判断方法所对应的具体对象\类型,从而调用具体的方法,这就是多态性;而编译时的多态,指的是通过参数的个数或者类型就可以确定调用哪个方法,当然,它只
发生在一个类中,这就是方法重载,它也是多态的体现。
四、总结
方法重载使得Java类中的代码变得更加简洁,相同的方法名通过不同的参数个数或者类型就可以实现不同的效果;而重载则可以让子类根据自己的特殊需求重新编写属于自己的代码,这正是多态性。应用好
重载和重写将能帮助我们设计出更加清晰简洁的Java类以及更加健壮的Java代码。
以上是关于java啥是方法重写的语法规则?的主要内容,如果未能解决你的问题,请参考以下文章