重写和重载
作者:互联网
继承可以增强代码的复用性,使得超类的public和protected成员可以在其子类中直接使用。然而有的子类有其特殊性,可能需要修改父类中的部分方法以满足其特殊需求,这便可以在子类中重写(overriding)这个方法来实现,但要注意,final修饰的方法不可重写。
重写的方法与原方法同名、同参数列表且同返回类型,在实际执行时应该调用哪个方法在运行时决定。如果使用父类的对象调用该方法,则运行父类版本的方法;如果用子类对象,则执行子类版本。当子类包含覆盖超类方法的方法时,它还可以使用关键字super来调用超类的方法。另外,子类中重写的方法的访问权限应该与父类相同或者更加严格 。
重载(overloading)是实现特殊多态(Ad hoc polymorphism)的一种手段。重载方法允许我们在类中重用相同的方法名,但其参数列表必须与已有的同名方法不同。重载在编译阶段决定具体要执行哪个方法,属于的静态类型检查。除了参数列表必须不同,重载方法的返回值类型、访问权限则可相同也可不同。我们可以在同一个类中进行重载,也可在其子类中重载。注意,子类在重载父类方法时,也继承了父类的被重载的方法。
下面针对public void method (int a, String b)给出几个具体的重载的例子,其中前三个是合法的重载,后两个是错误的:
1. public int method (int a, float b);
2. public void method (int a, String b, double c);
3. public void method (String a, int b);
4. public void method (int m, String n);
5. public String method (int a, String b);
另外,此处再列出一个具体例子来体现重载和重写方法的针对具体的实例对象的执行情况,行6的方法是重载,行8的方法是重写:
1 class Animal { 2 public void eat() 3 {System.out.println("I'm an animal. I like eating everything!");} 4 } 5 class Horse extends Animal { 6 public void eat(String food) 7 {System.out.println("I'm a horse. I like eating "+ food);} 8 public void eat() 9 {System.out.println(“I‘m a horse. I like eating grass!"} 10 }
下面是对方法的具体引用:
1 Animal a = new Animal(); 2 a.eat(); //I'm an animal. I like eating everything! 3 4 Horse h = new Horse(); 5 h.eat(); //I'm a horse. I like eating grass! 6 7 Animal ah = new Horse(); 8 ah.eat(); //I'm a horse. I like eating grass! 9 10 Horse he = new Horse(); 11 he.eat("Apples!"); //I'm a horse. I like eating Apples! 12 13 Animal a2 = new Animal(); 14 a2.eat("Carrots"); //error! 15 16 Animal ah2 = new Horse(); 17 ah2.eat("Carrots"); //error!
前两个是简单的父类对象调用父类方法,子类对象调用子类重写的方法;第三个是父类声明但子类创建的对象,调用了子类中的重写的方法,这是在运行时才确定的;第四个则是常规的对重载方法的调用;第五个报错了,因为父类中没有这种带String参数的方法;最后一个也是如此,即使它是通过子类Horse创建的对象,仍然在编译时因父类中没有对应方法而报错了。
标签:eat,子类,方法,重载,父类,重写,public 来源: https://www.cnblogs.com/diguawan/p/16354186.html