为什么可比较的实现工作

时间:2012-06-20 12:40:08

标签: java oop

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

    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变量。

5 个答案:

答案 0 :(得分:12)

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

好奇的Access Control from JLS 7 link。它说,“请注意,可访问性是一个静态属性,可以在编译时确定; 仅取决于类型和声明修饰符。”

答案 1 :(得分:3)

因为private variables在声明它们的类中可见,并且oPerson

答案 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);
    }
}