有人能解释一下为什么下面的代码正在处理私有成员变量吗?
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
变量。
答案 0 :(得分:12)
访问修饰符控制每个类而不是每个实例的访问。因此,类T
的方法可以访问其他类T
实例的所有成员(甚至私有)。
好奇的Access Control from JLS 7 link。它说,“请注意,可访问性是一个静态属性,可以在编译时确定; 仅取决于类型和声明修饰符。”
答案 1 :(得分:3)
因为private variables在声明它们的类中可见,并且o
是Person
。
答案 2 :(得分:1)
方法“compareTo”在“Person”类中实现,该类自然可以访问它的私有成员。您可以从Comparable接口覆盖该方法。所以你在两种情况下都在使用同一个类。
答案 3 :(得分:1)
因为同一类的对象可以访问彼此的私有属性。这并不能完全打破关注点的分离,因为这些访问的代码必须在同一个类中,因此类仍然负责该属性。
答案 4 :(得分: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);
}
}