02-25类成员的访问权限
面向对象编程的一大特性就是可以控制类成员的可访问性。当前主流的面向对象语言都拥有以下三种基本的可访问性。
1)公有:public 访问不受限制
2)私有:private 只有类自身成员可访问
3)保护:protected 子类可以访问,其他类无法访问
(1)public和private
public和private主要用于单个类的成员存取权限。
1 class A 2 { 3 public int publicI; 4 private int privateI; 5 protected int protectedI; 6 }
当外界创建一个A的对象时,之恩个访问A的公有实例字段publicI;
1 A a = new A(); 2 a.publicI = 100;//OK;
类A的私有实例字段privateI只能被自身的实例方法所使用:
1 public class A 2 { 3 public int publicI; 4 private int privateI; 5 protected int protectedI; 6 private void f() 7 { 8 privateI = 100;//OK 9 } 10 }
上述代码中,类A的私有方法f()访问了私有字段privateI.注意:只要是类A直接定义的实例方法,不管他是公有的还是私有的,都可以访问类自身的私有实例方法。
(2)protected
在形成继承关系的两个类之间,可以定义一种扩充权限--protected;
当一个类成员被定义为protected之后,所有外界类都不可以访问它,但其子类可以访问它。
以下详细说明子类可以访问父类的哪些部分:
1 class Parent //父类 2 { 3 public int publicF=0; 4 private int privateF=0; 5 protected int protectedf=0; 6 protected void protectedFunc() 7 { 8 9 } 10 } 11 class Child : Parent 12 { 13 14 public void ChildFunc() 15 { 16 publicF = 100;//正确,子类可以访问父类的公有字段 17 privateF = 200;//错误,子类不嗯能够访问父类的私有字段 18 protectedf = 300;//正确,子类可以访问父类的保护方法 19 protectedFunc();//正确,子类能访问父类的保护方法 20 } 21 }
当创建子类对象后,外界可以访问子类的公有成员和父类公有成员,如下所示:
1 Child obj = new Child(); 2 //可以调用子类的公有方法 3 obj.ChildFunc(); 4 //可以访问父类的公有字段 5 obj.publicF = 1000;
由此可见,可以通过子类对象访问其父类的所有公有成员,事实上,外界根本分不清对象的哪些公有成员来自父类,哪些公有成员来自子类本身。
总结:
- 所有不必让人知道的东西都是私有的;
- 所有需要向外提供的服务都是公有的;
- 所有的“祖传秘诀”,“密不外传”的都是受保护的;