什么意思"没有访问控制的方法可以在子类中声明更私密"在Java?

时间:2015-05-20 08:42:56

标签: java inheritance access-modifiers

在java访问修饰符和继承主题下面说4点。什么" 更私密"意味着第三点?

  1. ...
  2. ...
  3. 无访问控制声明的方法=>可以在子类中声明更私密
  4. ...

3 个答案:

答案 0 :(得分:1)

  

无访问控制声明的方法=>可以在子类中声明更私有

错误。这与案例正好相反。使用任何级别的访问控制声明的方法必须覆盖该级别或更公共级别:在这种情况下,访问级别基类是“默认”,因此您可以使用publicprotected.覆盖

与Google文档所说的相反,无法覆盖private.,请参阅JLS §8.4.8.3

  

覆盖或隐藏方法的访问修饰符(第6.6节)必须至少提供与重写或隐藏方法一样多的访问权限,如下所示:

     
      
  • 如果重写或隐藏方法为public,,则覆盖或隐藏方法必须为public;,否则会发生编译时错误。
  •   
  • 如果重写或隐藏方法为protected,,则覆盖或隐藏方法必须为protectedpublic;,否则会发生编译时错误。
  •   
  • 如果重写或隐藏方法具有包访问权限,则覆盖或隐藏方法不能为private;,否则会发生编译时错误。
  •   

答案 1 :(得分:0)

可在此Java Tutorial

中找到完整信息

在没有访问控制的情况下声明的方法可以在不在同一个包中的子类中重新定义(在此处覆盖不太正确的单词)。

package p1;
public class A {
    void m() {}
}


package p1;
public class B {
    //This does not work as class is in the same package and this would be an attempt to reduce visibility
    private void m() {}
}


package p2;
public class C extends A {
    //This works fine as class C does not 'see' the parent method
    private void m() {
    }
}

答案 2 :(得分:0)

This has a translation in Russian on RU.SO

实际上没有“更多”或“更少私人”这样的术语。而是使用“更多/更少可见”。

问题中的陈述是错误的。不能使方法不那么明显,因为这会破坏Liskov substitution principle

  

设Φ(x)是关于类型T的对象x可证明的属性。对于S类型的对象y,Φ(y)应该为真,其中S是T的子类型。

这是一个关于GitHub的回购,它说明了Java中包接访方法的继承所有可能的变种。 https://github.com/NickVolynkin/PackageAccessTest

public class Parent {

    //package access
    void foo() {
    }
}

public class ChildPublic extends Parent {

    // Legal
    @Override
    public void foo() {
    }
}

public class ChildProtected extends Parent {
    // Legal
    @Override
    protected void foo() {
    }
}

public class ChildPrivate extends Parent {
    // Illegal
    /*
    @Override
    private void foo() {
    }
    */
}

public class SamePackageAccessTest {
    {
        new Parent().foo();

        //these have overriden foo()
        new ChildPublic().foo();
        new ChildProtected().foo();

        //this one had not overriden foo()
        new ChildPrivate().foo();
    }
}

package otherpackage;
import test.*;
public class OtherPackageAccessTest {

    {
        //Legal!
        new ChildPublic().foo();

        //illegal
        /*
        new ParentPackage().foo();
        new ChildProtected().foo();
        new ChildPrivate().foo();
        */

    }
}