2012-07-24 75 views
7

我是Java新手,我有一个非常基本的问题。重写受保护的方法

我有2个父类下相同的包。 Animal抽象类和Machine类。

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

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

+2

你尝试过吗?结果是什么? – 2012-07-24 07:25:41

+0

继承之后出现重写...你说的是不可能的...... :) – 2012-07-24 07:31:12

回答

21
  • 保护 - 可被子类覆盖,无论他们是在同一个包或不
  • 默认(没有访问修饰符) - 可被访问或者如果两个类都在同一个包覆盖
+1

谢谢你回答这个基本问题。 :) – 2012-07-24 07:30:29

+0

这一个是正确的答案。丹尼斯萨利比奥,你应该玩一下阶级层次结构。 – TecHunter 2012-07-24 07:30:48

5

您只能通过扩展来覆盖方法。

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

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! 
+0

Animal animal = new Dog(); 我用这个代码来访问该方法,我只是想知道如果我可以覆盖受保护的方法。 – 2012-07-24 07:28:02

+0

谢谢你回答这个基本问题。 :) – 2012-07-24 07:32:17

+0

我已经更新了我的答案,以显示如何创建动物的匿名子类来表示一只狗,而不实际创建一个名为Dog的类。 – 2012-07-24 10:35:30

0

为了覆盖你必须扩展该类中的方法。这就是重写意味着什么:使用与超类相同的签名方法。

+0

谢谢你回答这个基本问题。 :) – 2012-07-24 07:33:42

1

,覆盖意味着继承父类的行为,如果不扩展类,这是不可能的。

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

谢谢你回答这个基本问题。 :) – 2012-07-24 07:34:39

0

重写定义说的行为..

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

所以AFAIK如果你没有扩展超类没有办法覆盖该方法。

0

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

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

回答你的问题的:
但是,如果你不想extendsAnimal classMachine class那么它不重写它只是一个正常的自己的类的功能。