覆盖受保护方法

14

我是Java的新手,有一个非常基础的问题。

我在同一个包下有2个父类。抽象类Animal和类Machine

现在,Animal抽象类有一个受保护的方法。我知道如果这些类在同一个包中,可以访问受保护的方法。

我可以在Machine类中访问该受保护的方法,那么问题来了...有没有可能覆盖这个受保护的方法? 而不用继承Animal类。


3
你尝试过做这件事吗?结果如何? - user647772
覆盖是继承之后发生的...你所说的不可能... :) - Dangling Piyush
答案是否定的。只有在你用“Animal”扩展你的类时,你才能重写“Animal”的方法。就像“class Machine extends Animal{}”一样。 - Shibin Francis
5个回答

36
  • protected - 可以被子类重写,无论它们是否在同一包中
  • default (没有访问修饰符) - 只有在两个类在同一包中时才能访问或重写

这是正确答案。Denis Salibio,你应该尝试一下类层次结构。 - TecHunter

9

您只能通过扩展来重写方法。

如果您愿意,可以使用匿名子类重写受保护的方法。例如:

public class Animal {

    protected String getSound() {
        return "(Silence)";
    }

    public void speak() {
        System.out.println(getSound());
    }
}

在另一个类中:

public static void main(String ... args) {

    Animal dog = new Animal() {

        @Override
        protected String getSound() {
            return "Woof!";
        }   
    }

    dog.speak();
}

将输出:
Woof!

Animal animal = new Dog();我使用这段代码来访问方法,我想知道是否可以覆盖受保护的方法。 - Dennis Salibio
我已经更新了我的答案,展示了如何创建一个匿名的Animal子类来表示一只狗,而不是创建一个名为Dog的类。 - ᴇʟᴇvᴀтᴇ

2

不可以,覆盖意味着从父类继承行为,而不扩展类是不可能的。

public class PClass
{
    protected boolean methodA()
    {
        return true;
    }
}

public class CClass  extends PClass
{
    protected boolean methodA()
    {
        return false;
    }
}

运行下面的代码以测试它。
public static void main(String[] args) 
{

    PClass pc = new CClass();
    System.out.println(pc.methodA());

}

O/p=false

这里我们覆盖了methodA的行为。

0
为了覆盖一个方法,你必须扩展那个类。这就是覆盖的意思:拥有与超类相同签名的方法。

0

覆盖的定义是..

子类中具有与超类中一个实例方法相同签名(名称,加上其参数的数量和类型)和返回类型的实例方法将覆盖超类的方法。

所以据我所知,如果您不扩展超类,就无法重写该方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接