13

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

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

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

我可以在我的Machine类中访问该受保护方法,问题是.. 是否可以覆盖该受保护方法?不扩展Animal类。

4

6 回答 6

34
  • protected - 可以被子类覆盖,无论它们是否在同一个包中
  • 默认(无访问修饰符)- 只有在两个类都在同一个包中时才能访问或覆盖
于 2012-07-24T07:26:50.677 回答
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!
于 2012-07-24T07:27:06.023 回答
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

于 2012-07-24T07:31:52.133 回答
0

protected 只能由其他包中的子类访问。同一个包中的类也可以访问受保护的字段、方法和构造函数,即使它们不是受保护成员类的子类。

Override : 子类中具有相同签名的实例方法。

你的问题的答案:
但如果你不想extends Animal class在你的Machine class那么它不会覆盖它只是你自己班级的正常功能。

于 2012-07-24T07:53:20.280 回答
0

根据定义覆盖说..

子类中具有相同签名(名称,加上其参数的编号和类型)和返回类型作为超类中的实例方法的实例方法会覆盖超类的方法。

因此,如果您不扩展超类,则 AFAIK 就无法覆盖该方法。

于 2012-07-24T07:46:41.333 回答
0

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

于 2012-07-24T07:28:04.967 回答