举例说明,重写父类方法和隐藏父类方法的区别
时间: 2024-09-24 14:14:13 浏览: 43
Java中方法的重写与成员变量的隐藏
重写父类方法和隐藏父类方法是面向对象编程中的两个重要概念,它们在处理继承关系时有明显区别。
**重写方法(Method Overriding)**:
当子类继承自父类并且有一个与父类同名、同参数列表(也可能有泛型约束)的方法时,子类可以提供自己的实现,这就是重写。例如,在Java中,如果父类Animal有一个sound()方法,子类Dog就可以覆盖这个方法,定义为bark(),然后当我们创建Dog对象并调用sound()时,实际上会执行Dog版本的声音方法。
```java
class Animal {
public void sound() {
System.out.println("Generic animal sound");
}
}
class Dog extends Animal {
@Override
public void sound() { // 重写父类sound方法
System.out.println("Woof!");
}
}
```
当你创建Dog对象并调用`dog.sound()`时,它会打印出"Woof!",而不是"Generic animal sound"。
**隐藏父类方法(Method Hiding)**:
在某些语言(如Java和C#)中,如果子类中定义了一个与父类同名但不同签名(参数列表不同)的方法,那么父类的同名方法就会被“隐藏”起来,不会被子类的对象直接访问。然而,这种隐藏并不影响父类对自身方法的调用。比如,虽然Dog类有自己的sound()方法,但如果试图通过父类引用调用Animal的sound(),仍然会得到预期结果。
```java
class Animal {
public void sound(String type) {
System.out.println("Animal says " + type);
}
}
class Dog extends Animal {
@Override // 这里是重写,不是隐藏
public void sound() {
System.out.println("Woof!");
}
// 这里是隐藏父类的sound方法,因为参数不同
public void sound(String noise) {
super.sound(noise); // 调用父类的sound方法
}
}
```
在这个例子中,`dog.sound()`会打印"Woof!",而`animal.sound("woof")`会打印"Animal says woof"。
阅读全文