【问题标题】:What is the default access modifier in Java? [duplicate]Java中的默认访问修饰符是什么? [复制]
【发布时间】:2013-04-16 09:43:28
【问题描述】:

如果我没有明确说明方法或实例变量的默认访问修饰符是什么?

例如:

package flight.booking;

public class FlightLog
{
    private SpecificFlight flight;

    FlightLog(SpecificFlight flight)
    {
        this.flight = flight;
    }
}

这个构造函数的访问修饰符是受保护的还是封装的?同一个包中的其他类,即flight.booking,可以调用这个构造函数吗?

【问题讨论】:

  • 已经被this old question覆盖 寻找“无修饰符”和“默认”
  • 我用谷歌搜索了“java 默认访问修饰符”,第一个结果是来自 Oracle 的 Controlling Access to Members of a Class。一个简单的搜索...
  • 谢谢,我搜索过,但找不到相同的问题。不需要downvote
  • 对于特定问题,SO 比官方文档要简单得多,因此在尝试手册中的页面之前,我将单击突出的 SO 搜索结果。我很欣赏这样不必要的问题。
  • 是的。其他类可以使用构造函数。看到这个cheat sheet

标签: java access-modifiers


【解决方案1】:

来自 Java documentation

如果一个类没有修饰符(默认值,也称为包私有),则它仅在其自己的包中可见(包被命名为相关类的组 - 您将在后面的课程中了解它们。)

member level,您也可以使用public修饰符或no modifier(包私有),就像顶级类一样,含义相同。

你可以在这里阅读全文(我最近写的):

http://codeinventions.blogspot.com/2014/09/default-access-modifier-in-java-or-no.html

【讨论】:

  • 他问的是整个班级,而不是班级的内容。
【解决方案2】:

来自文档:

Access Levels
Modifier        Class    Package    Subclass    World
-----------------------------------------------------
public           Y        Y          Y           Y
protected        Y        Y          Y           N
(Default)        Y        Y          N           N
private          Y        N          N           N

【讨论】:

  • 默认似乎有点不合适,因为如果继承发生在同一个包中,子类可以使用“默认修饰符”(否)引用某些内容。
  • 世界意味着什么?
  • @EvinUgur 我认为有道理,例如,你可以有一个类 Canine,它有一个默认方法 eatHumans(), Wolves 是从那里扩展而来的,但是你在某处有一个包 pets,其中包含同样从 Canine 扩展而来的类 Dog,但你不希望它吃掉人类。
  • @ziMtyth World,如“全球”,可从我们拥有该类实例的任何地方访问。
【解决方案3】:

这取决于上下文。

当它在一个类中时:

class example1 {

    int a = 10; // This is package-private (visible within package)

    void method1() // This is package-private as well.
    {
        -----
    }
}

当它在一个界面中时:

interface example2 {

    int b = 10; // This is public and static.
    void method2(); // This is public and abstract
}

【讨论】:

  • 接口中的成员变量也是final
【解决方案4】:

默认访问修饰符是包私有 - 仅在同一个包中可见

【讨论】:

  • 为什么你在同一个包中写可见,你的意思是如果我们写 class A { int a=0; },所以它应该可以通过包的其他类访问??
【解决方案5】:

这是一个代码示例,应该可以为您总结一下...除了以下内容之外,还展示了您如何无法访问另一个包中的默认值。

如果子类在另一个包中,则子类中的默认值不可访问,但如果子类在同一个包中,则可以访问。

package main;

public class ClassA {
    private int privateVar;
    public int publicVar;
    int defaultVar;
}

package main;

public class ClassB {
    public static void main(String[] args) {
        ClassA a = new ClassA();
        int v1 = a.publicVar;   // Works
        int v2 = a.defaultVar;  // Works
        int v3 = a.privateVar;  // Doesn't work

    }
}

package other;

public class ClassC {
    public static void main(String[] args) {
        ClassA a = new ClassA();
        int v1 = a.publicVar;   // Works
        int v2 = a.defaultVar;  // Doesn't work
        int v3 = a.privateVar;  // Doesn't work
    }
}

【讨论】:

  • 我给了你+1,但后来我注意到你的解释中有一个错误。它说“默认值在子类中不可访问,并且像私有的一样(并且在涉及子类时不像受保护的或公共的)。”这不是真的。在子类的情况下,如果它在同一个包中,它可以使用默认访问修饰符访问成员,而如果它在另一个包中,则不能。所以请指正!!!请记住:“默认”访问修饰符是包私有的,这意味着同一包中的每个类(无论是否扩展它)都可以访问它。
  • 很好的发现。我修改了措辞。
  • 谢谢,这个例子
【解决方案6】:

默认修饰符是package。只有同一包中的代码才能调用此构造函数。

【讨论】:

    【解决方案7】:

    是的,它在同一个包中可见。不允许该软件包之外的任何内容访问它。

    【讨论】:

      【解决方案8】:

      默认访问修饰符是 package-private(即 DEFAULT),并且在同一个包中可见。

      【讨论】:

        【解决方案9】:

        您的构造函数的访问修饰符将是 package-private(default)。正如您已将类声明为 public,它将在任何地方可见,但构造函数不会。您的构造函数将仅在其包中可见。

        package flight.booking;
        
        public class FlightLog // Public access modifier
        {
            private SpecificFlight flight;
        
            FlightLog(SpecificFlight flight) // Default access modifier
            {
                this.flight = flight;
            }
        }
        

        如果您不在类中编写任何构造函数,则编译器会生成一个默认构造函数,该构造函数具有与该类相同的访问修饰符。对于以下示例,编译器将生成一个带有 public 访问修饰符(与 class 相同)的默认构造函数。

        package flight.booking;
        
        public class FlightLog // Public access modifier
        {
            private SpecificFlight flight;
        }
        

        【讨论】:

          【解决方案10】:

          默认访问修饰符 - 如果一个类没有修饰符(默认值,也称为包私有),则它仅在其自己的包中可见(包是相关类的命名组)。

          【讨论】:

            【解决方案11】:

            不,您不能调用其他包的默认访问级别。但是您可以在包内访问。关注this link了解更多详情。

            【讨论】:

              【解决方案12】:

              这个构造函数的访问修饰符是protected还是package?

              我认为你的构造函数访问修饰符隐含地是你的类的访问修饰符。由于您的类具有公共访问权限,因此构造函数将隐式具有公共访问权限

              【讨论】:

              • 不,它是包私有的:只有同一个包中的类可以实例化它。
              【解决方案13】:

              来自一本名为OCA Java SE 7 Programmer I的书:

              不使用任何显式访问定义的类的成员 修饰符是使用包可访问性定义的(也称为默认 可访问性)。具有包访问权限的成员只能访问 在同一个包中定义的类和接口。

              【讨论】:

                猜你喜欢
                • 2011-02-01
                • 2014-03-27
                • 1970-01-01
                • 1970-01-01
                • 2014-04-01
                • 2013-06-06
                • 2014-05-09
                相关资源
                最近更新 更多