包私有类中的公共方法

将方法标记为在包私有类中是否有区别?public

class SomePackagePrivateClass
{
    void foo();          // package private method

    public void bar();   // public method
}

和这里之间的可见性是否有任何实际差异?foobar


答案 1

使用继承的示例:

答.java

package pkg1

class A {
  void foo();
  public void bar() {};
}

乙.java

package pkg1

public class B extends A{

}

C.java

package pkg2

public class C {
  public void doSomething() {
   B b = new B();
   b.bar(); //ok
   b.foo(); //won't work, since foo() is not visible outside of package 'pkg1'

   A a = new A(); //won't work since A is not visible outside of package 'pkg1'
   a.bar(); //won't work, since a cannot be created
  }
}

答案 2

如果该类不打算由另一个更明显的子类*扩展,则唯一的区别是意图的清晰度。将所有方法包声明为私有会使将来的读者更难确定哪些方法应由同一包中的其他类调用。

*这对我来说作为设计解决方案没有多大意义,但从技术上讲仍然是可能的。