2011-03-21 81 views

回答

11

覆盖方法不能减少可见性。允许这将违反Liskov Substitution Principle,其中声明(简化)派生类B的所有对象都必须具有与基类A相同的属性。在这种情况下,一个这样的“财产”将是一种公开的方法foo,如果B具有相同的方法,但将其作为protected,则该方法将会“丢失”。

另外,由于private方法没有被继承(尝试从派生类中调用它),所以它们不能被覆盖。您可以在基类中使用与private同名的public方法,但这不是重写,它只是具有相同名称的新方法,而不是其他关系。调用基类中的private方法将会在调用超类中的public方法时,即使在超类的对象上执行时,而不是也会调用public方法!

换句话说:private方法从来没有使用运行时多态性。

请参见本示例:

public static class Base { 
    public void callBoth() { 
     foo(); 
     bar(); 
    } 

    private void foo() { 
     System.out.println("Base.foo"); 
    } 

    protected void bar() { 
     System.out.println("Base.bar"); 
    } 
} 

public static class Sub extends Base { 
    public void foo() { 
     System.out.println("Sub.foo"); 
    } 

    public void bar() { 
     System.out.println("Sub.bar"); 
    } 
} 

当执行new Sub().callBoth()输出将是这样的:

 
Base.foo 
Sub.bar 
+0

好的谢谢。 :) – newbie 2011-03-21 14:33:51

1

因为它不会破坏类合同进行的方法更多的可用。如果Kitten是Animal的子类,并且Animal有一个公共方法feed(),那么Kitten还必须有一个公共方法feed(),因为它必须可以像处理Animal的实例一样对待任何Kitten实例。将访问级别重新定义为私有会破坏这一点。

1

如果公共方法变为私有方法,那么就不可能将实例上传到其父类中(因为其中一种方法将不可用)。

如果私有方法变为公共,那么可以将实例放入它的父类中(因为那样你就无法获取私有的/公开的overriden方法)。

1

访问级别不能是更多限制性比重写的方法。

私人 - > [预设] - >保护 - >公共

1

通过重写你说,你的子类可以使用相同的API调用,但可能具有不同的功能。公开某些东西会增加访问级别 - 所以你不能删除保证的功能。

通过公开私有方法(如果您实际上可以这样做),您将删除功能,从而打破“合同”。它也没有意义,因为该方法仍然可以公开呼叫,只是公共呼叫将访问超类中的公共方法,这是违反直觉的。