当 class 具有默认访问权限时,Java 成员访问权限

Java member access when class has default access

假设我有一个 class 声明为默认访问权限。如果 class 中的成员被声明为 protectedpublic,它是否等同于被声明为具有 default 访问权限的成员?

例如:

在CarA.java中:

class CarA { //class declared with default access
   public int odometer;
   protected void forward(int distance){...
   }
   protected static void tally(){...
   }
}

在CarB.java中:

class CarB { //class declared with default access
   int odometer;
   void forward(int distance){...
   }
   static void tally(){...
   }
}

CarACarB 等价吗?

我的理由是,由于 class 未声明为 public,class 在其包外不可访问,因此其成员不应在其包外访问包也是如此。有人可以确认我的想法是正确的吗?

不,这些不等同。里程表几乎具有同等特权*,而方法则不会。

这是因为您所说的 "default access",也称为包私有,意味着该包的其他成员可以访问相关对象或方法。因此,在您制作里程表 public 的地方,它基本上可用于任何有权访问父 class 的对象,方法的受保护状态将可用于包和 classes扩展了有问题的 class,即使它们在包之外,不像 package-private.

*CarA 中的 public 里程表可以通过此包外部的对象或方法访问,方法是通过扩展此 class 的 public class 路由它而 CarB 中的包专用里程表将始终是包专用的。这是为什么应该避免编写这样的代码的一个重要原因,其他开发人员可能会认为该变量不是 public 可用。

不,它们不等同。在同一个包中定义这些:

public class CarC extends CarA { }

public class CarD extends CarB { }

并且在不同的包中:

import your.package.CarC;
import your.package.CarD;
public class NewClass
{
    public static void tryThis(CarC c, CarD d) {
        int n1 = c.odometer;  // legal
        int n2 = d.odometer;  // illegal
    }
}

据我所知,当您可以创建 class 的实例或继承 class.[=10 时,您可以访问 class 的成员=]

默认class包外无法访问。所以我认为你也不能继承它(在包之外)。所以我觉得他们差不多。

当您可以访问 class 本身(CarA)时,您可以访问 class 的受保护成员。

希望我是对的,这给了你一些想法。