在java中,我对何时公开类感到困惑

在java中,我对何时公开类感到困惑,java,Java,我正在深入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(){

我正在深入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());
        }

    }
}

所以在这个例子中,76类可以从另一个没有任何公共类的文件中生成类。我不明白为什么第一个文件可以包含所有这些类,为什么它们不在单独的类中。我读到一个非公共的类在默认情况下是私有的,并且只能在同一个类中调用。因此,Nose文件中的所有内容只能在Nose文件中调用?

如果您排除了public,并且没有任何其他内容,如protected或private,则称为package protected。这应该可以向您解释这些差异:

这个问题的答案是一个视角问题

如果您是一名新的Java学习者,并且正在学习语言特性和面向对象的范例,那么一个合理的答案是您应该始终将类公开,因为可见性限制只对您重要。可见性只是生产代码或导出API供其他客户端使用时的问题。在你知道如何编写好的类之前,公开类并不是不合理的。然而,我不会将这个建议扩展到类的字段

然而

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

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

您可能正在使用的其他API可能会对您施加一些重要的例外情况。例如,如果您正在为JavaFX开发一个控制器类,那么在javafx2.2中,无论您是否愿意,您都需要公开您的类。即使如此,这些异常也不会打破API中的所有内容都应该具有尽可能低的可见性的规则

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

public MyClass该类对包中的类和其他包中的类可见。 受保护的MyClass该类将对包中的类可见,并且仅对属于MyClass子类的其他类可见。 MyClass这是默认访问或包专用访问。MyClass仅对同一包中的类可见。 private MyClass该类不能访问除同一.class文件中的类以外的其他类。 默认访问和专用访问被视为非导出可见性级别。具有这些可见性级别的类可以由您自由修改,因为它们的实现细节不会作为任何API的一部分导出


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

默认情况下,非公共的类是私有的-您在哪里读到的?这是完全错误的。一个非公共的类在默认情况下是私有的,这在Java中是不正确的!。。。另外,类不能声明为私有或受保护,除非它是内部类或静态嵌套类。我一定读错了,我的意思是包私有而不是私有。谢谢,我想我理解得更多。当它说在同一个包中时,这是否意味着在同一个文件夹中?所以在我展示的例子中,Of76可以制作Nose的对象,因为它们来自同一个文件夹/包。如果它是公共的,我可以从任何其他文件夹访问类?我如何指定它们在哪个文件夹中。@不,这意味着在同一个包中,不一定在同一个文件夹中。例如,如果您创建了两个jar,它们都有相同的包,那么这些受包保护的类可以看到彼此,即使它们位于不同的文件夹中。这是一个你通常不会利用的非常深奥的事实。但是,使用它的一种方法是让不同文件夹中的测试类在生产类上调用包保护的方法。好的,谢谢,我想我有足够的时间继续,我还没有了解JAR或包。我来自python,我假设一个包是一个库,或者你可以导入一个模块文件夹。Jar是分发库的一种方式。