Java中的默认访问修饰符是什么?

yra*_*lik 111 java access-modifiers

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

例如:

package flight.booking;

public class FlightLog
{
    private SpecificFlight flight;

    FlightLog(SpecificFlight flight)
    {
        this.flight = flight;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Sur*_*tta 105

来自Java 文档

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

member level,您还可以使用public修饰符或no modifier(package-private),就像使用顶级类一样,具有相同的含义.

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

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


Pra*_*eep 87

来自文档:

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

  • 默认似乎略显不合适,因为子类可以使用"默认修饰符"(no)引用某些内容,前提是继承发生在同一个包中. (5认同)
  • @ziMtyth World,就像在"Global"中一样,可以从我们拥有该类实例的任何地方访问. (2认同)

SKG*_*SKG 32

这取决于具体情况.

当它在一个类中时:

class example1 {

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

    void method1() // This is package-private as well.
    {
        -----
    }
}
Run Code Online (Sandbox Code Playgroud)

当它在一个界面内时:

interface example2 {

    int b = 10; // This is public and static.
    void method2(); // This is public and abstract
}
Run Code Online (Sandbox Code Playgroud)

  • 接口中的成员变量也是"final". (3认同)

Evg*_*eev 20

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


JTH*_*Cat 12

Here is a code sample which should pretty much sum this up for you... In addition to the below, showing how you can't access a default in another package there is one more thing.

Default is not accessible in a subclass if the class that subclasses it is in another package, but it is accessible if the subclass is in the same package.

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

  • 我给了你+1,但后来我发现你的解释有一个错误.它说"默认在子类中是不可访问的,并且像私有一样(当涉及子类时,它不像受保护的或公共的那样)." 这不是真的.在子类的情况下,如果它在同一个包中,它可以访问具有默认访问修饰符的成员,而如果它在另一个包中,则它不能.所以请更正!!! 请记住:'default'访问修饰符是package-private,这意味着同一个包中的每个类(无论是否扩展)都可以访问它. (2认同)

cah*_*hen 5

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


小智 5

是的,它在同一包装中可见。该软件包以外的任何内容都将无法访问。