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

时间:2011-05-12 16:16:59

标签: java class access-modifiers internal

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

7 个答案:

答案 0 :(得分:55)

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

package com.sample;

class MyPackagePrivateClass
{
    ...
}

答案 1 :(得分:8)

删除访问修饰符与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;
    }
}

<强>爪哇

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;
    }
}

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

答案 2 :(得分:5)

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

java在C#中是否与内部修饰符完全等效?简短的答案是否定的(但是你可以实现它的一些方式,我会告诉你)!!

C#中的内部实际上是一个“assembly-private”修饰符。什么是集会?

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

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

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

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

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

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

答案 3 :(得分:1)

是。它被称为包私有,你只需要定义没有任何修饰符的类:

package com.blah; class Foo{ }

答案 4 :(得分:1)

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

public =任何人都可以访问

private =只能在当前班级中访问

protected =可在包内或从当前类

继承的任何类中访问

默认=可在包中访问

我一直认为应该有一种方式可以说“可以从任何继承当前类的类访问,但不能从其他任何地方访问,这个包或任何其他类”。但没有。

答案 5 :(得分:0)

您可以将类包设为本地。这是类的默认范围。即你没有访问修饰符的地方。

如果你真的想放一些时间你可以创建一个注释,例如@package_local,我这样做的地方是我想让它成为本地包,而不是让它没有特别说明。

答案 6 :(得分:0)

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