我最近开始学习Java。如果私有变量可以被
main()
中的对象直接访问,它们如何“私有”?
public class Account1 {
private int accountNum;
private String name;
Account1() {
accountNum = 1101;
name = "Scott";
}
public void showData() {
System.out.println("Account Number: " + accountNum +
"\nName: " + name);
}
public static void main(String[] args) {
Account1 myA1 = new Account1();
myA1.showData();
System.out.println(myA1.accountNum); //Works! What about "Private"?!
}
}
这给出了输出:
Account Number: 1101
Name: Scott
1101
您的 main 位于 Account1 类中,因此它仍然在同一范围内。
私有变量可以从属于同一类型的任何代码访问。如果您的主要方法位于单独的类中,那么它将无法访问它们(不使用反射)。
给定类的“main”方法是该类的一部分。 属于类的方法可以访问该类的私有成员。 这对我来说很有意义。 当然,并不一定意味着您应该使用它。
考虑它的一种方法是考虑一个类对另一个类内部运作的了解。 我的 Person 类不应该知道我的 Order 类中发生了什么;它只是调用公共方法。 但是 Person 内部的任何东西当然都会知道 Person 的内部结构——甚至是 Person 的不同实例。
这是因为 main() 函数是该类的成员。它可以访问班级的所有成员。
在现实世界的代码中,主函数通常位于“harness”类中,该类实际上引导其余的代码。这个线束类通常非常轻量级,并实例化其他执行实际工作的类。
它们是私有的,因为它们只能由该类访问。 这意味着它们可以从该类的静态方法(例如
main
)以及实例方法(例如showData
)访问。
类的一个实例也可以访问类的另一个实例的私有成员。
如果您有一个单独的类,例如
Account2
,它将无法访问 Account1
的 provate 成员。
private
可从其封闭的顶级类访问字段、方法和构造函数Java 语言规范 在这个主题上非常清晰明确。参见示例 6.6-5。访问私有字段、方法和构造函数以获取文本和示例代码。 引用:
private
类成员或构造函数只能在包含成员或构造函数声明的顶级类 (
§7.6) 的主体内访问。它不被子类继承。 您将
main
方法放入包含
private
成员字段的类中。因此 main
中的代码可以访问那些 private
成员字段。如果您将相同的 main
方法复制到另一个类,它将无法编译。私有构造函数也是如此。仅当在拥有该构造函数的类中时, main
方法才可以调用
new
通过其 private
构造函数实例化对象。将这样的 main
方法移动到另一个类将无法编译。