默认(包)访问级别的类中方法的默认(包)和公共访问级别是否有区别?
问题描述:
代码同样的问题:默认(包)访问级别的类中方法的默认(包)和公共访问级别是否有区别?
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
}
答
是有区别的,当你继承美孚:
public class Bar extends Foo {
}
然后尝试在另一个包:
new Bar().getIntProperty()
它会在你的例子第二编译(所有的方法public),但不第一个(所有方法默认访问)
答
实现接口
我只能想象默认接入类实现一些接口。然后,您需要使用公共访问方法来实现它(然后,您的默认访问类将通过接口在包外部访问)。
像任何私人/保护/匿名实现的接口。
Java语言必须支持它。
编辑
想象一下,你创建一个实例,并把它传递了一个局外人类(作为对象)。
我不确定反射访问控制,但可能是局外人类无法通过反射(包外)访问默认方法。如果他们公开,你可以。
答
是&没有。
在给出的例子中,没有什么意义的区别 - 至少当涉及其他类访问方法时。但有时你必须......
public interface Bar {
CustomObject getObjectProperty();
}
而且Foo implements Bar
,在这种情况下,公众是必要的,即使在一个包私人美孚。
答
从http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html看起来好像没有公开的成员在第一个例子中对于Foo的子类是不可见的,而在第二个例子中公共成员设置的公共成员对于Foo的子类是可见的。
答
这是一个包含公共级别方法()的包级别类的示例() 以确保访问级别不能比重写的方法更具限制性。
假设公共级超类具有公共访问级别的方法。而包级子类想要继承那个超级类,那么你也需要公共级别的方法。例如:
public class A { public void method() }
class B extends A { public void method() }
注意:Bar与Foo相同 – idrosid 2010-02-03 16:14:42
第一个真实答案 – Roman 2010-02-03 18:27:48