2014-09-21 77 views
3

这是什么意思,如果你让一个类的默认访问,并标记该类中包含的方法公开?换句话说,如果封闭类无法公开访问,怎么能公开访问方法?默认访问类中的公共访问方法..有什么意义?

+0

也许通过[抽象工厂模式](http://en.wikipedia.org/wiki/Abstract_factory_pattern)或[生成器模式](http://en.wikipedia.org/wiki/Builder_pattern)用于创建实例。 – 2014-09-21 14:25:01

+0

低质量问题:[docs](http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html) – afzalex 2014-09-21 14:26:16

+0

@afzalex,请不要像'低质量问题'这样的无理评论回答这个问题..看看其他帖子,人们实际上给出了有意义的答案。 – user3516726 2014-09-21 15:13:04

回答

2

在某些情况下可能需要公开方法,例如,当您的具有默认访问权限的类实现公共接口时。

当您的API根据接口定义并且您的默认访问类实现了其中一个公共接口时,这非常有用。您的API的用户可以通过工厂方法实例化您的默认访问类。

+0

你指出了一件非常有趣的事情。我没有想到这一点。谢谢。 – user3516726 2014-09-21 14:56:01

+0

还有一个问题。这是唯一的情况下,在默认访问类中声明公共方法是有意义的吗? – user3516726 2014-09-21 15:14:27

+1

@ user3516726这是最常见的情况,也是唯一严格要求的情况(我计算在这个类别中实现公共抽象类和非抽象类)。其他情况并不严格要求公开的方法,但是您可以选择继续使用,以向在您之后维护您的代码的人强调这些方法旨在供任何有权访问此类的人使用。 – dasblinkenlight 2014-09-21 17:07:45

2

public当您重写某些公开方法或实现interface s时经常需要。
我们来看一下Object#equals方法的一个简单例子。

尽管您的主类有默认范围,但您不能在覆盖可见性的同时覆盖此方法。 所以你需要:public void equals(.......

0

你的意思是这样的:

package p1; 
class C1 { 
    public void publicMethod() {} 
} 

在另一个包:

package p2; 
import p1.C1; // not allowed 
public class C2 { 
    C1 c1; // not allowed 
    void test() { 
     c1.publicMethod(); // not allowed 
    } 
} 

在继承的情况下,publicMethod可用于:

package p1; 
public class C2 extends C1 {} 

现在publicMethod能访问:

package p2; 
import p1.C2; // C2 is public, ok ! 
public class C3 { 
    C2 c2; // C2 is public, ok ! 
    void test() { 
     c2.publicMethod(); // C2 is public, use publicMethod of C1 ! 
    } 
} 

因此,减少一个class可见性对于不应该在包外部直接使用的类型的abtract类是有用的。

+0

你说'如果继承可以使用publicMethod'。但是如果这个类被声明为默认访问,那么在它之外的任何方法(甚至是公共的)都可以在包之外访问。事实上,在包之外,你甚至不能用默认访问来继承一个类。 – user3516726 2014-09-21 15:09:51

+0

p1.C2(public)扩展p1.C1(默认)。 p1.C2实例可以在任何包中访问p1.C1的公共方法。试试看吧。 – 2014-09-21 15:41:10

+0

我觉得有一些误解。我说的是,默认访问方法只能从包内部调用,而不能在外部调用。如果你有一个'受保护的'访问方法,那么它甚至可以从包的外部被子类调用。 – user3516726 2014-09-21 16:26:04

相关问题