【转载】JAVA成员变量的访问权限

JAVA成员变量的访问权限

时间2013-03-21 19:15:00                        博客园精华区                                                                原文                 http://www.cnblogs.com/yujy/archive/2013/03/21/2974040.html                                                        

     成员变量的访问权限      
   
   
         我看到很多地方谈到关于Java里变量的访问权限问题.      
     很多地方认为对于默认修饰符的理解是这样的:      
     不写时默认为friendly      
     但就我所知Java里没有 friendly这一关键字.      
     当然学过C++的人都知道,在C++里有 friendly,而且其访问权限和Java里不写时默认情况一样.      
     我觉的可以这样理解,但不能这么认为.C++和Java毕竟是两种不同的语言,许多规则是不同的.      
     如果我说的有哪里不正确,请大家改正,谢谢.      
     
     访问权限修饰符声明了成员变量的访问权限。Java提供的显示的访问权限修饰符有3种,分别是:私有(private)、保护(protected)和公 共(public)。除此之外,还有一种默认的访问权限:friendly,它并不是Java的关键字,只有当变量前面没有写明任何访问权限修饰符时,就 默认以friendly作为访问权限。为了表达上的方便,省略了其中"成员"两字,将被这些修饰符所修饰的变量分别称为私有变量、保护变量和公共变量。下 面分别讨论各个修饰符的用法。      
     1.公共变量      
     凡是被public修饰的成员变量,都称为公共变量,它可以被任何类所访问。即允许该变量所属的类中所有方法访问,也允许其他类在外部访问。       
     公共变量使用示例。      
     public class declarePublic{      
     public int publicVar=10; //定义一个公共变量      
     }      
     在类declarePublic中声明了一个公共变量publicVar,它可以被任何类所访问。下面这段程序中,类otherClass可以合法地修改变量publicVar的值,而无论otherClass位于什么地方。      
     public class otherClass{      
     void change(){      
     declarePublic ca=new declarePublic(); //创建一个declarePublic对象      
     ca.publicVar=20; //通过对象名来访问它的公共变量,正确      
     }      
     }      
     用public修饰的变量,允许任何类在外部直接访问,这破坏了封装的原则,造成数据安全性能下降,所以除非有特别的需要,否则不要使用这种方案。      
             2.私有变量        
     
     凡是被private修饰的成员变量,都称为私有变量。它只允许在本类的内部访问,任何外部类都不能访问它。      
     私有变量使用示例。      
     public class declarePrivate{      
     private int privateVar=10; //定义一个私有变量       
     void change(){      
     privateVar=20; //在本类中访问私有变量,合法      
     }      
     }      
     如果企图在类的外部访问私有变量,编译器将会报错。      
     public class otherClass{      
     void change(){       
     declarePrivate ca=new declarePrivate(); //创建一个declarePrivate对象      
     ca.privateVar=20; //企图访问私有变量,非法      
     }      
     }      
     为了让外部用户能够访问某些私有变量,通常类的设计者会提供一些方法给外部调用,这些方法被称为访问接口。下面是一个改写过的declarePrivate类。      
     public class declarePrivate{      
     private int privateVar=10; //定义一个私有变量       
     void change(){      
     privateVar=20;      
     }      
     public int getPrivateVar(){ //定义一个接口,返回私有变量privateVar的值      
     return privateVar;      
     }      
     public boolean setPrivateVar(int value){ //定义一个接口,可以设置privateVar      
     的值      
     //可以在这里先检测value是否在允许的范围内,然后再执行下面的语句。      
     privateVar = value;      
     return true;      
     }      
     }      
     私有变量很好地贯彻了封装原则,所有的私有变量都只能通过程序员设计的接口来访问,任何外部使用者都无法直接访问它,所以具有很高的安全性。但是,在下面这两种情况下,需要使用Java另外提供的两种访问类型:      
     通过接口访问私有变量,将降低程序的性能,在程序性能比较重要的情况下,需要在安全性和效率间取得一个平衡。      
     私有变量无法被子类继承,当子类必须继承成员变量时,需要使用其他的访问类型。      
     
     3.保护变量      
     凡是被protected修饰的变量,都被称为保护变量。除了允许在本类的内部访问之外,还允许它的子类以及同一个包中的其他类访问。子类是指从该类派生 出来的类。包是Java中用于管理类的一种松散的集合。二者的详细情况将在第4章介绍。下面是一个简单的例子。      
     保护变量使用示例。      
     下面这个程序先定义一个名为onlyDemo的包,declarProtected类就属于这个包。      
     
     public class declareProtected{      
     protected int protectedVar=10; //定义一个保护变量      
     void change(){      
     protectedVar=20; //合法      
     }      
     }      
     说明:读者编译这个文件时,需要用这个命令(下同):      
     javac -d . 文件名      
     下面这个otherClass类也定义在onlyDemo包中,与declareProtected类同属于一个包。      
     
     public class otherClass{ //它也在包onlyDemo中      
     void change(){       
     declareProtected ca=new declareProtected();      
     ca.protectedVar=20; //合法      
     }      
     }      
     下面这个deriveClass类是declareProtected的子类,它并不在onlyDemo包中。它也可以访问保护变量protectedVar,但是只能通过继承的方式访问。      
     import onlyDemo.declareProtected; //引入需要的包      
     public class deriveClass extends declareProtected{ //定义一个子类      
     void change(){      
     //合法,改变的是deriveClass从declarProtected中所继承的protectedVar值       
     protectedVar=30;       
     }       
     }      
     说明:import是Java中的关键字,用于引入某个包。这将在4.13节中详细介绍。      
     子类如果不在父类的同一包中,是无法通过"对象名.变量名"的方式来访问protected类型的成员变量,比如下面这种访问是非法的:      
     import onlyDemo.declareProtected;      
     public class deriveClass extends declareProtected{ //定义一个子类      
     void change(){      
     declareProtected ca=new declareProtected();      
     ca.protectedVar=30; //错误,不允许访问不在同一包中的保护变量      
     }       
     }      
     4.默认访问变量      
     如果在变量前不加任何访问权修饰符,它就具有默认的访问控制特性,也称为friendly变量。它和保护变量非常像,它只允许在同一个包中的其他类访问, 即便是子类,如果和父类不在同一包中,也不能继承默认变量(这是默认访问变量和保护变量的唯一区别)。因为它限定了访问权限只能在包中,所以也有人称默认 访问权限为包访问权限。      
      默认访问变量使用示例。      
     package onlyDemo; //本类定义在包中      
     public class declareDefault{      
     int defaultVar=10; //定义一个默认访问变量      
     void change(){      
     defaultVar=20; //合法      
     }      
     }      
     
     onlyDemo包中的其他类,可以访问defaultVar变量:      
     package onlyDemo;      
     public class otherClass{ //它也在包onlyDemo中      
     void change(){       
     declareDefault ca=new declareDefault();      
     ca.defaultVar=20; //合法      
     }      
     }      
     下面是它的子类,也在onlyDemo包中。它除了可以像包中其他类那样通过"对象名.变量名"来访问默认变量,还可以通过继承的方式来访问。      
     package onlyDemo;      
     public class deriveClass extends declareDefault{ //定义一个子类      
     void change(){      
     //合法,改变的是deriveClass从declarDefault中所继承的defaultVar值       
     defaultVar=30;       
     }       
     }      
     如果子类不在onlyDemo包中,就不会继承默认变量,也就无法像上面那样来访问。      
     import onlyDemo.declareDefault;      
     public class deriveClass extends declareDefault{ //定义一个子类      
     void change(){      
     defaultVar=30; //非法,这个变量没有继承下来      
     }       
     }    
 

相关主题
  • JavaJava                    

如果你感兴趣
分享该文章

20111332_4drb.png

20111332_vfx1.png                    

       

该来源最新文章  


转载于:https://my.oschina.net/diedai/blog/266776

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值