2

谁能解释一下为什么下面的代码正在处理私有成员变量?

    public class Person implements Comparable<Person> {
    private String firstName;
    public Person(String firstName) {
        this.firstName = firstName;
        }

    @Override
    public int compareTo(Person o) {
        return firstName.compareToIgnoreCase(o.firstName);  // why does it work?    }    }
    }
}

编辑为什么o.firstName要编译?其中 firstName 是private可变的。

4

5 回答 5

12

访问修饰符控制每个类而不是每个实例的访问。因此,类的方法可以访问其他类实例T的所有成员(甚至是私有的) 。T

JLS 7 中的访问控制链接供好奇的人使用。它说:“请注意,可访问性是可以在编译时确定的静态属性;它仅取决于类型和声明修饰符。”

于 2012-06-20T12:43:14.730 回答
3

因为私有变量在声明它们的类中是可见的,并且oPerson.

于 2012-06-20T12:42:27.570 回答
1

“compareTo”方法在“Person”类中实现,该类自然可以访问它的私有成员。您从接口 Comparable 覆盖该方法。因此,在这两种情况下,您都在使用同一个班级。

于 2012-06-20T12:42:58.787 回答
1

因为同一类的对象可以访问彼此的私有属性。这并没有完全破坏关注点的分离,因为此类访问的代码必须在同一个类中,因此该类仍然负责该属性。

于 2012-06-20T12:44:20.533 回答
0

您在类中使用声明它们的私有成员,这完全没问题。

声明类始终可以访问其所有成员,无论成员属于哪个类的实例。

因此,以下代码编译并工作。

public class AClass {
    private String name;
    public AClass(String n) {name = n;}

    public void mock(AClass other) {
        System.out.pritln(this.name + ": \"" + other.name + " smells.\"");
    }

    public static void main(String[] args) {
        AClass a = new AClass("Bully");
        AClass b = new AClass("Nemesis");
        a.mock(b);
    }
}
于 2012-06-20T12:43:11.457 回答