java中的基本练习

时间:2011-07-06 10:19:47

标签: java

我有两个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。你能帮我解释一下吗?

9 个答案:

答案 0 :(得分:5)

您可以访问B.salary,因为您的代码正在课程B内执行。

private(或事实上所有访问修饰符)的一个常见误解是它基于每个对象的行为,这是不正确的。 private字段是整个类的私有字段。因此,B的每个实例都可以访问彼此salary对象的B字段。即使static中的B代码也能做到这一点。

另请注意,通过引入课程A,您不必要地使问题复杂化:它对您的示例没有实际影响,您可以简单地将其删除。

答案 1 :(得分:3)

private适用于类定义之外的内容,类定义中的所有内容都可以看到它们。

mainB的(静态)成员,因此可以看到私人成员。

答案 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