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

时间:2010-02-03 15:54:23

标签: java oop

代码中的相同问题:

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   
}

5 个答案:

答案 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() }