类具有默认访问权限时的Java成员访问权限

类具有默认访问权限时的Java成员访问权限,java,packages,Java,Packages,假设我有一个使用默认访问权限声明的类。如果类中的成员被声明为受保护或公共,它是否等同于被声明为具有默认访问权限的成员 例如: 在CarA.java中: class CarA { //class declared with default access public int odometer; protected void forward(int distance){... } protected static void tally(){... } } 在CarB.

假设我有一个使用默认访问权限声明的类。如果类中的成员被声明为
受保护
公共
,它是否等同于被声明为具有
默认
访问权限的成员

例如:

在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(){...
   }
}
CarA
CarB
是否等效


我的理由是,由于该类未声明为
public
,因此该类在其包外不可访问,因此其成员也不应在其包外可访问。有人能证实我的想法是正确的吗?

不,这两种观点是不同的。里程表几乎具有同等特权*,方法则不具有同等特权

这是因为您所称的“默认访问”(也称为包私有)意味着该包的其他成员可以访问所讨论的对象或方法。因此,在您将里程表公开的地方,它基本上对任何可以访问父类的人都是可用的,方法的受保护状态对包和扩展该类的类都是可用的,即使它们在包之外,这与包私有不同


*CarA中的公共里程表可以通过扩展该类的公共类路由到该包之外的对象或方法来访问,而CarB中的包私有里程表将始终是包私有的。这就是为什么我们应该避免编写这样的代码的一个很好的原因,其他开发人员可能会认为该变量不是公开可用的。

不,它们不是等价的。在同一软件包中定义这些:

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

据我所知,您可以在创建类的实例或继承类时访问该类的成员

无法在包外部访问默认类。所以我认为你也不能继承它(在包外)。所以我认为它们几乎是一样的

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


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

看看这个,我相信你需要。方法可见性和类可见性没有区别。。afaik。看来这些资源分别处理类和成员的访问权限,但不是我上面提到的组合。@BagusTesa如果类具有默认(包私有)访问权限,您将如何从包外部访问公共成员?
里程表
也不完全相同——请参见我的答案。很好的回答。我没有想过偷偷地通过一个公共类。Glen Pierce,你说“方法的受保护状态只对扩展该类的类可用,而不是包中的任何东西”。如果我理解正确,
protected
成员在同一个包中的任何位置都可见,包括非子类。@flow2k如果你是正确的,我已经编辑了我的答案。谢谢:)看起来我犯了错误——上面ajb有一个聪明的反例。这很可怕。