144

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

例如:

package flight.booking;

public class FlightLog
{
    private SpecificFlight flight;

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

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

4

13 回答 13

129

来自 Java文档

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

在 中member level,您也可以no modifier像使用顶级类一样使用 public 修饰符或 (package-private),并且具有相同的含义。

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

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

于 2013-04-23T08:52:26.073 回答
121

从文档:

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
于 2015-07-14T17:18:27.053 回答
40

这取决于上下文。

当它在一个类中时:

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
}
于 2013-12-23T23:00:10.553 回答
22

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

于 2013-04-23T08:50:55.513 回答
15

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

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

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
    }
}
于 2014-01-02T04:45:45.323 回答
5

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

于 2013-04-23T08:52:43.780 回答
5

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

于 2015-10-21T11:13:02.143 回答
3

Default 访问修饰符是包私有的(即 DEFAULT),它只在同一个包中可见

于 2013-04-23T09:26:52.787 回答
2

您的构造函数的访问修饰符将是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;
    }
}

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

package flight.booking;

public class FlightLog // Public access modifier
{
    private SpecificFlight flight;
}
于 2013-04-23T09:03:05.863 回答
1

不,您不能调用其他包的默认访问级别。但是您可以在包内访问。点击此链接了解更多详情。

于 2014-04-21T04:59:48.860 回答
1

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

于 2014-04-21T05:38:06.680 回答
0

此构造函数的访问修饰符是受保护还是封装?

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

于 2013-04-23T08:50:23.407 回答
0

从一本名为OCA Java SE 7 Programmer I的书中:

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

于 2015-08-17T10:26:13.710 回答