江明涛的博客
Java继承的覆盖和隐藏问题
Java继承的覆盖和隐藏问题

Java继承的覆盖和隐藏问题

在Java中,继承是一种重要的面向对象编程概念。它允许一个类继承另一个类的属性和方法,从而实现代码的复用。然而,在实际开发中,我们经常会遇到继承中的覆盖和隐藏问题,这是我们需要特别注意的地方。

覆盖(Override)

覆盖是指在子类中重新定义父类的方法。当子类继承了父类的某个方法,但是这个方法不能完全满足子类的需求时,我们可以在子类中重新编写该方法的实现。子类中的这个方法会覆盖掉父类中的同名方法,使得子类在调用该方法时执行的是自己的实现。

覆盖要求子类方法的签名(即方法名、参数列表和返回类型)与父类方法完全一致,这样才能成功覆盖。例如,假设我们有以下父类:

public class Animal {
    public void makeSound() {
        System.out.println("Animal makes sound");
    }
}

然后,我们创建一个子类Dog来继承Animal类:

public class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Dog barks");
    }
}

在这个例子中,Dog类覆盖了父类Animal的makeSound方法,并在方法体中打印了”Dog barks”。当我们实例化一个Dog对象并调用makeSound方法时,程序会输出”Dog barks”。

隐藏(Hide)

隐藏是指在子类中定义了与父类相同名称的属性或方法。与覆盖不同的是,隐藏并不是替换父类的方法实现,而是在子类中隐藏父类的成员,使得在使用子类对象访问该成员时,执行的是子类自己的定义。

隐藏要求子类成员的名称与父类成员完全一致,但是类型可以不同。举个例子,我们用以下代码来说明隐藏的概念:

public class Vehicle {
    public String brand = "Ford";
    
    public void displayInfo() {
        System.out.println("This is a vehicle.");
    }
}
public class Car extends Vehicle {
    public int brand = 2021;
    
    public void displayInfo() {
        System.out.println("This is a car.");
    }
}

在这个例子中,Car类隐藏了父类Vehicle中的brand属性和displayInfo方法。当我们实例化一个Car对象并调用displayInfo方法时,程序会输出”This is a car.”而不是”This is a vehicle.”。同样,当我们访问Car对象的brand属性时,会得到2021而不是Ford。

总结

在Java继承中,覆盖和隐藏是两个重要的概念。通过覆盖,子类可以重写父类的方法,以满足自身的需求;而通过隐藏,子类可以定义自己的属性和方法,与父类的同名成员进行区分。在实践中,我们需要根据具体情况选择使用覆盖还是隐藏,以实现代码的正确运行和维护。