如何理解重写的方法不能比被重写的方法有更低的访问权限(Java)

问题 1:多态性受限

        如果子类将父类的 public 方法重写为 private,那么虽然父类方法在父类对象中是 public 的,但对于父类的引用指向子类的对象时,由于子类的重写方法是 private,就会无法通过父类的引用调用子类的重写方法,因为 private 方法只能在子类内部访问,而不能被外部访问。       

问题 2:接口契约破坏

        在继承的关系中,父类和子类之间是有一个接口契约的。父类的方法公开(public)是对外提供的接口,子类重写父类方法时,应该保持这个接口的可用性。如果子类将父类的 public 方法重写为 private,就会导致外部代码无法通过父类的 public 方法调用子类的实现,这破坏了接口的可用性和一致性。

例子:

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

class Dog extends Animal {
    @Override
    private void makeSound() {  // 编译错误: The method makeSound() from the type Dog must override a superclass method
        System.out.println("Dog barks");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog();
        animal.makeSound();  // 这里将尝试调用 Dog 类中的 makeSound 方法
    }
}


        如果我们通过 Animal 类型的引用来指向 Dog 对象,并尝试调用 makeSound() 方法,将无法访问 Dog 类中的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值