默认(包)访问级别的类中方法的默认(包)和公共访问级别是否有区别?

问题描述:

代码同样的问题:默认(包)访问级别的类中方法的默认(包)和公共访问级别是否有区别?

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),但不第一个(所有方法默认访问)

+0

注意:Bar与Foo相同 – idrosid 2010-02-03 16:14:42

+0

第一个真实答案 – Roman 2010-02-03 18:27:48

实现接口

我只能想象默认接入类实现一些接口。然后,您需要使用公共访问方法来实现它(然后,您的默认访问类将通过接口在包外部访问)。

像任何私人/保护/匿名实现的接口。

Java语言必须支持它。

编辑

想象一下,你创建一个实例,并把它传递了一个局外人类(作为对象)。

我不确定反射访问控制,但可能是局外人类无法通过反射(包外)访问默认方法。如果他们公开,你可以。

+0

我可以想象他的类没有实现任何接口,正如您可以从代码中清楚地看到的那样。 – danben 2010-02-03 16:02:38

+0

我想不是:),但代码只是一个例子,他正在寻找差异。无论如何,涉及子类的答案似乎更有希望。 – helios 2010-02-03 17:32:26

是&没有。

在给出的例子中,没有什么意义的区别 - 至少当涉及其他类访问方法时。但有时你必须......

public interface Bar { 
    CustomObject getObjectProperty(); 
} 

而且Foo implements Bar,在这种情况下,公众是必要的,即使在一个包私人美孚。

http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html看起来好像没有公开的成员在第一个例子中对于Foo的子类是不可见的,而在第二个例子中公共成员设置的公共成员对于Foo的子类是可见的。

+0

如何在另一个包中创建Foo的子类? – Roman 2010-02-03 16:07:06

+0

哈 - 好点! Foo在它自己的包裹之外是不可见的。 – 2010-02-03 16:09:39

+0

您不能在另一个软件包中创建Foo的子类,或者在另一个软件包中创建Foo的实例,因为该软件包的缺省访问级别不会被该软件包“看到”。 – Jon 2010-02-03 16:10:52

这是一个包含公共级别方法()的包级别类的示例() 以确保访问级别不能比重写的方法更具限制性。

假设公共级超类具有公共访问级别的方法。而包级子类想要继承那个超级类,那么你也需要公共级别的方法。例如:

public class A { public void method() } 

class B extends A { public void method() }