0

我正在研究java并遇到了这个例子

interface Nose{
    public int iMethod();
}

abstract class Picasso implements Nose{
    public int iMethod(){
        return 7;
    }
}

class Clowns extends Picasso{}

class Acts extends Picasso{
    public int iMethod(){
        return 5;
    }
}

因为没有任何东西被宣布为公共,这是否意味着这些类都不能从另一个文件中调用?我有另一个文件

public class Of76 extends Clowns{
    public static void main(String[] args) {
        Nose [] i = new Nose[3];
        i[0] = new Acts();
        i[1] = new Clowns();
        i[2] = new Of76();
        for(int x = 0; x < 3; x++) {
            System.out.println(i[x].iMethod()+" "+i[x].getClass());
        }

    }
}

所以在这个例子中, class Of76 可以从另一个没有任何公共类的文件中创建类。我对为什么第一个文件可以包含所有这些类以及为什么它们不在单独的类中感到困惑。我读到一个非公共的类默认是私有的,只能在同一个类中调用。那么鼻子文件中的所有内容都只能在那个鼻子文件中调用吗?

4

2 回答 2

6

当您排除public并且没有其他任何东西时,protected或者private这被称为“包保护”。这应该向您解释差异:在 Java 中,默认、公共、受保护和私有之间的区别

于 2013-10-14T18:40:38.293 回答
2

这个问题的答案是一个观点问题。

如果你是一个新的 Java 学习者并且你正在学习语言特性和面向对象的范式,那么一个合理的答案是“你应该总是制作类public”,因为除了你之外,可见性限制对任何人都没有影响。可见性仅对生产代码或当您导出 API 供其他客户端使用时是一个问题。在您知道如何编写好的类之前公开类并不是不合理的(但是,我不会将此建议扩展到类的字段)。

然而...

如果您正在维护或修改生产代码 - 或 - 开发您打算导出以供其他程序员使用的 API,那么最好的答案是“public除非您的明确意图是您的客户应该能够访问您的类并在他们自己的客户端代码中使用它。

可见性是 Java 中最重要的安全和封装机制之一,在生产环境中您永远不应该对它漠不关心。API 中的所有内容都应具有尽可能低的可见性。

您可能正在使用的其他 API 可能会对您施加一些重要的例外情况。例如,如果您正在为 JavaFX 开发控制器类,那么在 JavaFX 2.2 中,无论您是否愿意,都需要将您的类公开。即便如此,这些例外并没有违反“API 中的所有内容都应具有尽可能低的可见性”的规则。

TL;DR:如果您正在处理的代码只能由您访问,那么您不需要将类设为公开。如果您正在处理生产代码、其他人可以使用的代码或您打算导出以供客户使用的 API,那么您永远不应该公开类,除非它是您设计中明确指出的部分。

  • public MyClass这个类将对您包中的类和其他包中的类可见。
  • protected MyClass这个类对你的包中的类是可见的,并且只对属于 MyClass 子类的其他类可见。
  • MyClass这是“默认访问”或“包私有”访问。MyClass 仅对同一包中的类可见。
  • private MyClass除了那些在同一个 .class 文件中的类之外,这个类对其他类不可见。

默认访问和私有访问被视为非导出的可见性级别。您可以自由修改具有这些可见性级别的类,因为它们的实现细节不会作为任何 API 的一部分导出。

公共和受保护的访问被视为导出的可见性级别。通常,一旦您将一个类作为 API 的一部分导出,您就应该“永远”继续支持它。

于 2013-10-14T19:56:02.680 回答