Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中有类似内部类的东西吗?_Java_Class_Access Modifiers_Internal - Fatal编程技术网

Java中有类似内部类的东西吗?

Java中有类似内部类的东西吗?,java,class,access-modifiers,internal,Java,Class,Access Modifiers,Internal,在C#中,您可以将类标记为internal,以便只能从同一个包中访问它。Java中有类似的东西吗?您可以通过在类的声明中省略安全修饰符(public,private)来创建包私有类 package com.sample; class MyPackagePrivateClass { ... } 删除访问修饰符类似于C#中的内部 C# Java public class A { public static int X; static int Y; private

在C#中,您可以将类标记为
internal
,以便只能从同一个包中访问它。Java中有类似的东西吗?

您可以通过在类的声明中省略安全修饰符(public,private)来创建包私有类

package com.sample;

class MyPackagePrivateClass
{
    ...
}

删除访问修饰符类似于C#中的内部

C#

Java

public class A
{
    public static int X;
    static int Y;
    private static int Z;
}
class B
{
    public static int X;
    static int Y;
    private static int Z;
    public class C
    {
        public static int X;
        static int Y;
        private static int Z;
    }
    private class D
    {
        public static int X;
        static int Y;
        private static int Z;
    }
}

资料来源:

是。它被称为包私有,您只需定义不带任何修饰符的类:


包com.blah;
类Foo{}

您可以将类包设置为本地。这是类的默认范围。i、 e.没有访问修饰符的地方

如果你真的想在某个时候添加注释,你可以创建一个注释,例如@package_local,我会在我特别希望它是package local的地方创建注释,而不是不指定它。

是的,默认(package private)访问级别。只需在类定义中省略任何访问修饰符,就可以得到所需的内容。

我对C#不熟悉,但在Java中,默认的保护是某些内容只能在包中访问:

公共=任何人都可以访问

private=只能在当前类中访问

protected=可在包内或从当前类继承的任何类中访问

默认值=可在包内访问


我一直认为应该有一种方式来表示“可由从当前类继承的任何类访问,但不能从任何其他地方访问,包括此包或任何其他”。但是没有。

这个问题以前有一个公认的答案,但我认为对于一些来自.Net的java新手来说,答案并不完全清楚

java对C#中的内部修饰符是否有一些精确的等价物?简短的回答是否定的(但你可以通过某种方式实现它,我会告诉你)

C#中的internal实际上是一个“assembly private”修饰符。什么是集合

程序集是项目的任何产品(C#中的DLL或EXE,java中的等效程序可以是JAR文件)

java中没有任何完全等效的内部代码。Bryan Kyle回答并接受的实际上是“包私有”(java中的包相当于C#中的名称空间),但有些回答是获得相同结果的最接近的方法

但如何获得与内部测试完全相同的结果呢?java就不能解决这个问题吗?答案是肯定的

确实有。但不能用修饰语。 实际上,最好的方法是在包装上保密。打包的最佳实践是根据类的关系而不是类型来打包类

我们中的许多人使用名为“模型”或“演示者”的包,并将所有模型或演示者放在其中。虽然这是错误的。包应该类似于包含“BookModel.java”、“BookPresenter.java”的“Book”


通过这种方式,您可以通过省略修饰符使它们成为包私有,并且没有任何问题,因为您可以在任何需要您的包私有类的类中访问它们,因为您有很好的打包实践。

可能重复@cmmi:不完全重复,因为问题是从完全不同的角度提出的。答案是一样的。请注意,C没有
——它们有
名称空间
程序集
。包相当于名称空间。但是程序集可以与Java中的JAR文件相比较。
internal
修饰符使类只能在程序集中访问。因此,它与名称空间或包没有任何关系。包的封装比assembly@hB0:不可能!如何声明在不同包中引用的“内部”帮助程序类?你根本无法理解我的意思是“一种更好的软件设计方式”,而不是更多的功能密集型(MS总是提供),尽管我同意包是一个远离命名空间的定义,对类库的几个部分进行编程,当类必须相互调用时,这可能会有点奇怪,但您不希望从库外部访问这些类,如果您想实现这一点,就不能将这些类放在单独的包中。创建一个“内部”包可能是最安全的方法,因为只有自己的库使用的类可能是最安全的方法。可以手动压缩已经编译好的类(我在各种情况下都必须这样做)——如果java中可以使用“内部”方法,那么就可以在类之间轻松访问“内部”方法,而这些类之间不应该有这样的可见性。jar并不像dll那样被严格封装。在最后的评论中,C#已经“保护内部”@projectshave没有错。C#中的“受保护的内部”也可以从程序集的所有位置访问。实际上,在C#juse中,要将类的访问权限限制为其子类,请使用“protected”。而在java中,“protected”可以从同一个包以及子类访问。只有当类A、B、C、D在同一个包中时,这才有效。。而在C#中,它们必须位于同一命名空间中,@User1234位于同一程序集中,而不是命名空间中。
public class A
{
    public static int X;
    static int Y;
    private static int Z;
}
class B
{
    public static int X;
    static int Y;
    private static int Z;
    public class C
    {
        public static int X;
        static int Y;
        private static int Z;
    }
    private class D
    {
        public static int X;
        static int Y;
        private static int Z;
    }
}