在包私有类中将方法标记为public
会不会有什么不同?
class SomePackagePrivateClass
{
void foo(); // package private method
public void bar(); // public method
}
此处foo
和bar
之间的可见性是否存在实际差异?
答案 0 :(得分:41)
使用继承的示例:
A.java
package pkg1
class A {
void foo();
public void bar() {};
}
B.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
}
}
答案 1 :(得分:19)
如果该类不会被另一个更明显的子类*扩展,唯一的区别是意图清晰度。将所有方法包声明为私有使得将来的读者更难以确定哪些方法应该被同一包中的其他类调用。
* 作为我的设计解决方案没有多大意义,但技术上仍然可行。
答案 2 :(得分:9)
方法必须是 public的另一种情况是在创建某个公共类或接口的包私有实现时。由于不允许您降低被覆盖方法的可见性,因此必须公开这些方法。
答案 3 :(得分:6)
嗯......我也有这个疑问(这就是为什么我搜索这个帖子)。这可能是一个很好的问题。
但是......
经过一番思考,事情真的比我们想象的要简单。
package-private方法,是一种包私有方法。
似乎胡说八道?但是......
一个package-private方法,即使它的类是继承的,它仍然是一个包私有方法。
现在更有意义吗?有关更详细的解释:
一个package-private方法,即使它的类由一个更可见的子类继承,它仍然是仍然是一个package-private方法。
如果子类属于同一个包,则这些包私有方法也会被继承,但它们仍然是包私有。
如果子类是不同的包(在这里,我们需要父类是公共的,使用一些包私有方法),那些包私有方法不继承(因为它们不可见)在所有)。
需要注意的一点是,这可能是造成这种疑问的原因,公共类中的包私有方法在其包外也不可见。
以上解释了package-private方法。公共方法的情况也是一样。
当一个包私有类由一个公共子类(同一个包,这是必须的)继承时,它的公共方法作为公共方法继承,因此它们成为一个公共类中的公共方法。
在OP示例中,由于foo()
和bar()
都在包私有类中,此时它们的可见性仅限于包私有,直到添加更多代码(例如继承)
希望这很清楚(也很简单)。
答案 4 :(得分:5)
除非通过公共(或受保护的嵌套)类扩展类,否则它几乎没有什么区别。
为了保持一致,我会选择public
。除了public
或private
之外,方法应该很少见。
包private java.lang.AbstractStringBuilder
类中有许多公共方法示例。例如,length()
在AbstractStringBuilder
中是公开的,并在公共类StringBuilder
中公开(在StringBuffer
中重写以添加同步)。
答案 5 :(得分:3)
是。包私有类中的public
方法可能很有用(尽管它们很少见)。来自java库的示例性示例(取自经典书籍"有效的java"):
java.util.JumboEnumSet, java.util.RegularEnumSet
吗?可能不是,因为它们是私有的,文档中没有提到。
你曾经使用过它们吗?可能是。它们由java.util.EnumSet.noneOf(...)
的静态方法返回。虽然你不能自己构造它们,但是当你从这个方法返回它们时,可以使用它们的公共方法。
关于这一点的好处是,你不知道你正在使用哪一个,甚至不知道它们存在。 Java根据参数决定哪一个更有效,并且可能在较新版本中使用不同的on。您只能通过他们的通用界面引用它们来访问它们的功能(无论如何这是一个很好的做法!!)
答案 6 :(得分:-1)
foo
有default package visibility
bar
public
可见度