我有两个A和B类如下:
public class A {
private int salary = 0;
protected void calculate() {
salary = 400;
}
protected A() {
calculate();
}
}
public class B extends A {
private int salary = 0; // (1)
protected void calculate() {
System.out.println("calculating salary...");
salary = 700;
}
public static void main(String[] args) {
System.out.println(new B().salary); // (2)
}
}
考虑第(2)行:我不明白为什么new B().salary
有效,因为第(1)行中的工资说明符是private
。你能帮我解释一下吗?
答案 0 :(得分:5)
您可以访问B.salary
,因为您的代码正在课程B
内执行。
private
(或事实上所有访问修饰符)的一个常见误解是它基于每个对象的行为,这是不正确的。 private
字段是整个类的私有字段。因此,B
的每个实例都可以访问彼此salary
对象的B
字段。即使static
中的B
代码也能做到这一点。
另请注意,通过引入课程A
,您不必要地使问题复杂化:它对您的示例没有实际影响,您可以简单地将其删除。
答案 1 :(得分:3)
private
适用于类定义之外的内容,类定义中的所有内容都可以看到它们。
main
是B
的(静态)成员,因此可以看到私人成员。
答案 2 :(得分:3)
我没有看到B
的任何私有构造函数,因此new B()
有效+私有字段可在同一类中访问
答案 3 :(得分:3)
每个班级都可以访问其私人部分。
答案 4 :(得分:2)
这是有效的,因为主位于 B 类中,这意味着所有字段(甚至私有)都可见。
如果您将 main 移至另一个类,它将不再有效。
答案 5 :(得分:2)
只能在同一个班级内访问私人字段。所以工资只能从B级获得。
由于您的主要方法是在B类,您可以访问它。
答案 6 :(得分:2)
第2行的工资是指您在B级中声明的工资,而您的主要方法是B类的一部分,因此main可以看到B的任何私人资料。
答案 7 :(得分:1)
每个班级都可以访问其私人会员。并且“薪水”在课堂上,与您的主要方法一起。这就是为什么main方法可以访问“薪水”。
答案 8 :(得分:0)
第2行与执行此操作相同:
B bObject = new B();
System.out.println(b.salary);
您可以访问私有变量,因为“bObject”属于B类型。现在您不能做的是:
A aObject = new A();
aObject.bSalary; //如果您将薪水变量的名称更改为bSalary