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

时间:2017-05-10 04:34:50

标签: java packages

假设我有一个使用默认访问权限声明的类。如果类中的成员被声明为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是否相同?

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

3 个答案:

答案 0 :(得分:3)

不,他们并不等同。在同一个包中定义它们:

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

答案 1 :(得分:2)

不,这些不等同。里程表几乎等同于特权*,方法不会。

这是因为您所谓的“默认访问”(也称为package-private)意味着该包的其他成员可以访问相关对象或方法。因此,在你公开使用里程表的情况下,它基本上可以用于访问父类的任何东西,方法的受保护状态可用于包和扩展相关类的类,即使它们不在包,不像package-private。

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

答案 2 :(得分:0)

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

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

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

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