以前对于java中类的访问控制没有做一定的研究,毕竟每次编代码由于Eclipse的智能型使得现在某些原理并没有实际的掌握,因此今天重新自己编代码将其区别分辨出来。
1. Private:它只能被所定义的类或类的不同对象所访问。当外部访问这个变量时将出错。
public class A {
private int a;
private void count(){
System.out.println("测试");
}
}
public class B {
public void acceptMethod(){
A a=new A();
a.a=10;
a.count();
}
}
这样是错误的,B不能访问A的属性及方法,因为类B不是A类型的。但是如果我让B继承A,这样它会对吗?答案也是否定的。如果B继承A,只能说明B是A的子类,并不能说明B就是A类型。因此这里可以将A中的访问权限改为public和protected;
2. Protected:允许类本身、子类以及相同包中的类访问它,属于家庭秘密型,不让外人知道
package A;
public class A {
protected int a;
protected void count(){
System.out.println("测试");
}
}
package B;
import A.A;
public class B extends A{
void test(){
A a=new A();
a.a=10;
a.count();
}
}
此方式是错误的,不被不同包中的类访问,所以是不能得到编译的。将该类放入同一包中,此时就是前面private说到的处理方式了,这样protected属性及方法就能得到访问。
3. Public是无秘密可言,任何人都能看到。即使在不同包中任然一样能够访问。拿protected前面处理的例子进行修改,将发现其是可行的。在这里就不做代码介绍了。
4. 缺省
Java中如果不显示地设置成员访问控制的时候,即缺省的访问控制,该访问控制允许在相同包中的类成员之间相互访问,相当于在同一包中的类是相互信任的朋友。
package A;
public class A {
int a;
void count(){
System.out.println("测试");
}
}
package B;
import A.A;
public class B extends A{
void test(){
A a=new A();
a.a=10;
a.count();
}
}
该方式处理是错误的,因为他们不属于同一个包中,且其访问方式是缺省的方式。处理方式是对缺省方式,将另外一个访问类放置于同一个包中。
总结:根据上面的例子及分析做如下总结。
1. Public的访问权限最大,可以被不同包中的任何类访问到。
2. Protected访问权限属于家庭秘密型,秘密只归“亲戚”所分享,因此不同包的类不允许其访问。
3. Private最自私,其只允许自己访问。因此针对某些需要保护的数据可以采用该修饰符。
4. 缺省访问权限与protected相类似。