一个关于封装性的思考
我们知道,在面向对象语言里都有private这个关键词,表示被这个修饰的属性或者方法,不想被其他的类或对象获取。即便是自身的对象,它也不能轻易获取。
为什么要说轻易呢,在Java中,由于反射机制的存在,实际上也是能获取到private的属性以及值的。
这个私有也只是相对其他类和对象而言,也就是说,在本类中的方法都可以调用自己的私有属性。
这没什么难理解的。
但是可能有一些小伙伴会认为private修饰后,如果创建了一个本类对象,这个对象是无法访问自己的私有属性的,其实这句话对也不对。
对的点在于 如果这个对象在另一个类中被创建出来,那么它确实不能访问自己的私有属性。(由于Java只有类,main方法也只能运行在某个类中)
但是如果在本类中,即便创建了对象,那这个对象也是能访问自己的私有属性的。
即本类能访问所有本类对象的私有属性,这是类权限,要更大一些。
java
public class Dog implements Comparable {
private int size;
private String name;
public Dog() {
}
public Dog(int size, String name) {
this.size = size;
this.name = name;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int compareTo(Dog uddaDog) {
return this.size - uddaDog.size;
}
private static class NameComparator implements Comparator<Dog> {
public int compare(Dog a, Dog b) {
return a.name.compareTo(b.name);
}
}
这里看一段Java代码,这里有两个参数被传入,分别是Dog a和Dog b,这时候你会发现这里直接调用a,b的私有属性name都是可以的,且不会报错。
这里的类是内部类,是在DOG类中,所以满足本类。
总结一下,就是本类的方法可以访问本类任何对象的私有属性!而不是本对象,这一点很多小伙伴都会搞混!