方法的覆盖
在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称、返回值类型、参数列表。
如果在新类中定义一个方法,其名称、返回值类型和参数列表正好与父类中的相同,那么,新方法被称做覆盖旧方法。
参数列表又叫参数签名,包括参数的类型、参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同。
被覆盖的方法在子类中只能通过super调用。
注意:覆盖不会删除父类中的方法,而是对子类的实例隐藏,暂时不使用。
请看下面的例子:
public class Demo{ public static void main(String[] args) { Dog myDog = new Dog("行行圈"); myDog.say(); // 子类的实例调用子类中的方法 Animal myAnmial = new Animal("行行圈在线"); myAnmial.say(); // 父类的实例调用父类中的方法 } } class Animal{ String name; html" target="_blank">public Animal(String name){ this.name = name; } public void say(){ System.out.println("我是一只小动物,我的名字叫" + name + ",我会发出叫声"); } } class Dog extends Animal{ // 构造方法不能被继承,通过super()调用 public Dog(String name){ super(name); } // 覆盖say() 方法 public void say(){ System.out.println("我是一只小狗,我的名字叫" + name + ",我会发出汪汪的叫声"); } }
运行结果:
我是一只小狗,我的名字叫行行圈,我会发出汪汪的叫声 我是一只小动物,我的名字叫行行圈在线,我会发出叫声
方法覆盖的原则:
覆盖方法的返回类型、方法名称、参数列表必须与原方法的相同。
覆盖方法不能比原方法访问性差(即访问权限不允许缩小)。
覆盖方法不能比原方法抛出更多的异常。
被覆盖的方法不能是final类型,因为final修饰的方法是无法覆盖的。
被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
被覆盖的方法不能为static。如果父类中的方法为静态的,而子类中的方法不是静态的,但是两个方法除了这一点外其他都满足覆盖条件,那么会发生编译错误;反之亦然。即使父类和子类中的方法都是静态的,并且满足覆盖条件,但是仍然不会发生覆盖,因为静态方法是在编译的时候把静态方法和类的引用类型进行匹配。
方法的重载:
前面已经对Java方法重载进行了说明,这里再强调一下,Java父类和子类中的方法都会参与重载,例如,父类中有一个方法是 func(){ ... },子类中有一个方法是 func(int i){ ... },就构成了方法的重载。
覆盖和重载的不同:
方法覆盖要求参数列表必须一致,而方法重载要求参数列表必须不一致。
方法覆盖要求返回类型必须一致,方法重载对此没有要求。
方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类中的所有方法(包括从父类中继承而来的方法)。
方法覆盖对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制。
父类的一个方法只能被子类覆盖一次,而一个方法可以在所有的类中可以被重载多次。
问题内容: 我有一个具有通用方法的抽象类,并且我想通过用特定类型代替通用参数来覆盖通用方法。所以在伪代码中,我有以下内容: 但是由于某种原因,我不允许这样做?我是在犯某种语法错误还是不允许这种继承和覆盖?具体来说,由于eclipse IDE不断提醒我要实现,我遇到了一个错误。 这就是我希望上面的代码起作用的方式。在我的代码的其他地方,有一个方法可以期望实现对象的实例,这具体意味着它们具有我可以使用
本文向大家介绍php继承中方法重载(覆盖)的应用场合,包括了php继承中方法重载(覆盖)的应用场合的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了php继承中方法重载(覆盖)的应用场合。分享给大家供大家参考。具体分析如下: 方法重载(override)/覆盖——在什么情况下使用:当父类知道所有的子类都需要用到一个方法,但父类不知道怎么去写这个方法时,就需要用到方法的重载。这时候,可以让子类
问题内容: 我正在阅读“深入Python”,并在有关类的章节中给出了以下示例: 然后作者说,如果要覆盖该方法,则必须使用正确的参数显式调用父方法。 如果该班有一个以上的祖先班怎么办? 我是否必须显式调用所有祖先类的方法? 另外,我是否必须对要覆盖的其他任何方法执行此操作? 问题答案: 关于子类-超类调用,这本书有些过时了。在子类化内置类方面也有些过时。 如今看起来像这样: 请注意以下几点: 我们可
本文向大家介绍Java方法覆盖重写实现原理解析,包括了Java方法覆盖重写实现原理解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java方法覆盖重写实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 方法覆盖重写注意事项: 1.必须保证方法名相同,返回值也相同 @Override:写在方法前面,用来检测方法的覆
问题内容: 为什么超类的实例变量在继承中不被覆盖? 问题答案: 因为继承旨在修改行为。行为是通过方法公开的,这就是为什么可以覆盖它们的原因。 字段不是行为而是状态。您不需要修改它,也不需要修改超类使用的私有方法。它们旨在让超类完成其工作。
问题内容: 这是我遇到的一个测试练习问题,希望您能帮助我理解概念 让Hawk成为Bird的子类。假设某个类有两个重载的方法void foo(Hawk h)和void foo(Bird b)。在声明Bird x = new Hawk()之后,将在调用foo(x)中执行哪个版本; 这是我到目前为止的代码,有人可以向我解释为什么foo(bird b)被执行吗? 问题答案: Java执行重载解析以选择方法