代码中的相同问题:
class Foo {
int getIntProperty () { ... }
CustomObject getObjectProperty () { ... }
void setIntProperty (int i) { ... }
void setObjectProperty (CustomObject obj) { ... }
//any other methods with default access level
}
VS
class Foo {
public int getIntProperty () { ... }
public CustomObject getObjectProperty () { ... }
public void setIntProperty (int i) { ... }
public void setObjectProperty (CustomObject obj) { ... }
//any other methods with public access level
}
答案 0 :(得分:5)
当你继承Foo时会有区别:
public class Bar extends Foo {
}
然后尝试另一个包:
new Bar().getIntProperty ()
它会在你的第二个例子中编译(所有方法都是公共的)但不是第一个(所有方法默认访问)
答案 1 :(得分:2)
从http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html看起来,在第一个示例中,未设置为public的成员对于Foo的子类是不可见的,而在第二个示例中,成员设置为public,对于Foo的子类是可见的
答案 2 :(得分:0)
实施接口
我只能想象你的默认访问类实现了一些接口。然后,您将需要公共访问方法来实现它(然后通过接口在包外部访问您的默认访问类。)
与接口的任何私有/受保护/匿名实现一样。
Java语言必须支持它。
修改强>
想象一下,您创建一个实例并将其传递给局外人类(作为对象)。
我不确定反射访问控制,但可能是局外人类无法通过反射(包外)访问默认方法。如果它们是公开的,你可以。
答案 3 :(得分:0)
是&号
没有任何有意义的区别 - 至少在访问该方法的其他类中 - 在您给出的示例中。但有时你有......
public interface Bar {
CustomObject getObjectProperty ();
}
和Foo implements Bar
,在这种情况下公共是必要的,即使在包私有Foo中也是如此。
答案 4 :(得分:0)
这是包含公共级别方法的包级别类的示例()
为了确保访问级别不能比重写方法更具限制性。
假设公共级别超类具有公共访问级别方法。和包级别子类想要继承那个超类,那么你也需要公共级别的方法。例如
public class A { public void method() }
class B extends A { public void method() }