zoukankan      html  css  js  c++  java
  • JAVA成员变量的访问权限

    成员变量的访问权限


    我看到很多地方谈到关于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; //非法,这个变量没有继承下来

    }

  • 相关阅读:
    设计模式学习总结系列应用实例
    【研究课题】高校特殊学生的发现及培养机制研究
    Linux下Oracle11G RAC报错:在安装oracle软件时报file not found一例
    python pro practice
    openstack python sdk list tenants get token get servers
    openstack api
    python
    git for windows
    openstack api users list get token get servers
    linux 流量监控
  • 原文地址:https://www.cnblogs.com/yujy/p/2974040.html
Copyright © 2011-2022 走看看