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

Svi*_*ish 39 java class access-modifiers internal

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

Bry*_*yle 55

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

package com.sample;

class MyPackagePrivateClass
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • @ hB0:没办法!您如何声明在不同包中引用的"内部"帮助程序类?你根本做不到 (18认同)
  • 虽然我同意一个包是远离命名空间的定义,但编写类库的几个部分可能有点奇怪,当类必须相互调用时,但是你不希望它们可以从那个库外部访问然后如果如果要实现这一点,就不能在单独的包上安装这些类.创建一个"内部"包可能,对于仅由自己的库使用的类可能是最安全的方法. (3认同)
  • 由于自然罐被打包,Jar可见修饰符不是Java的一部分.可以手动压缩已编译的类(我必须在各种场合下执行此操作) - 如果在java中可以使用"internal",那么可以轻松访问类之间的"内部"方法,这些方法之间不应该具有这样的可见性.jar不像dll那样以严格的方式封装. (2认同)

Ste*_*ris 9

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

C#

public class A
{
    public static int X;
    internal static int Y;
    private static int Z;
}
internal class B
{
    public static int X;
    internal static int Y;
    private static int Z;
    public class C
    {
        public static int X;
        internal static int Y;
        private static int Z;
    }
    private class D
    {
        public static int X;
        internal static int Y;
        private static int Z;
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

资料来源:http://www.javacamp.org/javavscsharp/internal.html

  • @ User1234在同一个程序集中,而不是命名空间. (12认同)

Ami*_*ati 6

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

java在C#中是否具有内部修饰符的精确等价物?简短的回答是否定(但你可以实现它如何和我会告诉)!!

C#中的internal实际上是一个"assembly-private"修饰符.什么是集会?

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

java中的内部没有任何确切的等价物.Bryan Kyle已经回答并接受的实际上是"包私有"(java中的包等同于C#中的命名空间)但是一些如何回答是获得相同结果的最接近的方法.

但是如何获得与内部完全相同的结果?不能java有一个解决方案吗?答案是肯定的.

它确实有.但不是修饰语.实际上,最好的方法是打包时的秘密.包装的最佳做法是按照他们的关系打包你的课程而不是他们的类型.

我们中的许多人使用名为"模型"或"演示者"的包,并将所有模型或演示者放入其中.虽然这太错了.包应该像"Book"包含"BookModel.java","BookPresenter.java",.....

这样你可以通过省略修饰符使它们成为包私有,并且没有任何问题,因为你可以在任何需要你的包私有类的类中访问它们,因为你有一个很好的打包实践.