当 class 具有默认访问权限时,Java 成员访问权限
Java member access when class has default access
假设我有一个 class 声明为默认访问权限。如果 class 中的成员被声明为 protected
或 public
,它是否等同于被声明为具有 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(){...
}
}
CarA
和 CarB
等价吗?
我的理由是,由于 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 的受保护成员。
希望我是对的,这给了你一些想法。
假设我有一个 class 声明为默认访问权限。如果 class 中的成员被声明为 protected
或 public
,它是否等同于被声明为具有 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(){...
}
}
CarA
和 CarB
等价吗?
我的理由是,由于 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 的受保护成员。
希望我是对的,这给了你一些想法。