• 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html
  • 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html

浅析Java中的访问权限控制

技术杂谈 勤劳的小蚂蚁 2个月前 (02-09) 64次浏览 已收录 0个评论 扫描二维码

今天我们来一起了解一下Java语言中的访问权限控制。在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制。考虑两个场景:
  场景1:工程师A编写了一个类ClassA,但是工程师A并不希望ClassA被该应用中其他所用的类都访问到,那么该如何处理?
  场景2:如果工程师A编写了一个类ClassA,其中有两个方法fun1、fun2,工程师只想让fun1对外可见,也就是说,如果别的工程师来调用ClassA,只可以调用方法fun1,那么该怎么处理?

此时,访问权限控制便可以起到作用了。
  在Java中,提供了四种访问权限控制:默认访问权限(包访问权限),public,private以及protected。
  注意,上述四种访问权限,只有默认访问权限和public能够用来修饰类。修饰类的变量和方法四种权限都可以。(本处所说的类针对的是外部类,不包括内部类)
  
下面就分别针对修饰类和修饰类的成员来讲述这四种访问权限控制。
1.修饰类
  默认访问权限(包访问权限):用来修饰类的话,表示该类只对同一个包中的其他类可见。
  public:用来修饰类的话,表示该类对其他所有的类都可见。
  
下面通过几个例子来看一下两者的区别:
例1:
Main.java
package com.cxh.test1;


publicclassMain {

   /**
    * @param args
    */
   publicstaticvoidmain(String[] args) {
       // TODO Auto-generated method stub
       
       People people = new People(“Tom”);
       System.out.println(people.getName());
   }

}


People.java
package com.cxh.test1;

classPeople{          
//默认访问权限(包访问权限)

   private String name = null;
   
   publicPeople(String name){
       this.name = name;
   }
   
   public String getName(){
       return name;
   }
   
   publicvoidsetName(String name){
       this.name = name;
   }
}

从代码可以看出,修饰People类采用的是默认访问权限,而由于People类和Main类在同一个包中,因此People类对于Main类是可见的。

程序运行结果:

例子2:
People.java
package com.cxh.test2;

classPeople{          
//默认访问权限(包访问权限)

   private String name = null;
   
   publicPeople(String name){
       this.name = name;
   }
   
   public String getName(){
       return name;
   }
   
   publicvoidsetName(String name){
       this.name = name;
   }

}


此时People类和Main类不在同一个包中,会发生什么情况呢?
  
下面是Main类中的提示的错误:
  
提示Peolple类在Main类中不可视。从这里就可以看出,如果用默认访问权限去修饰一个类,该类只对同一个包中的其他类可见,对于不同包中的类是不可见的。
  
正如上图的快速修正提示所示,将People类的默认访问权限更改为public的话,People类对于Main类便可见了。

2.修饰类的方法和变量
  默认访问权限(包访问权限):如果一个类的方法或变量被包访问权限修饰,也就意味着只能在同一个包中的其他类中显示地调用该类的方法或者变量,在不同包中的类中不能显示地调用该类的方法或变量。
  private:如果一个类的方法或者变量被private修饰,那么这个类的方法或者变量只能在该类本身中被访问,在类外以及其他类中都不能显示地进行访问。
  protected:如果一个类的方法或者变量被protected修饰,对于同一个包的类,这个类的方法或变量是可以被访问的。对于不同包的类,只有继承于该类的类才可以访问到该类的方法或者变量。
  public:被public修饰的方法或者变量,在任何地方都是可见的。
下面再通过几个例子来看一下它们作用域类的方法和变量时的区别:

例3:
Main.java没有变化
People.java
package com.cxh.test1;

publicclassPeople{      

   private String name = null;
   
   publicPeople(String name){
       this.name = name;
   }
   
   String getName(){    //默认访问权限(包访问权限)
       return name;
   }
   
   voidsetName(String name){   //默认访问权限(包访问权限)
       this.name = name;
   }
}

此时在Main类是可以显示调用方法getName和setName的。
但是如果People类和Main类不在同一个包中:
package com.cxh.test2;    //与Main类处于不同包中

publicclassPeople{      

   private String name = null;
   
   publicPeople(String name){
       this.name = name;
   }
   
   String getName(){    //默认访问权限(包访问权限)
       return name;
   }
   
   voidsetName(String name){   //默认访问权限(包访问权限)
       this.name = name;
   }

}


此时在Main类中会提示错误:
由此可以看出,如果用默认访问权限来修饰类的方法或者变量,则只能在同一个包的其他类中进行访问。
 
例4:
People.java
package com.cxh.test1;  

publicclassPeople{      

   private String name = null;
   
   publicPeople(String name){
       this.name = name;
   }
   
   protected String getName(){  
       return name;
   }
   
   protectedvoidsetName(String name){  
       this.name = name;
   }
}

此时是可以在Main中显示调用方法getName和setName的。
如果People类和Main类处于不同包中:
package com.cxh.test2;  

publicclassPeople{      

   private String name = null;
   
   publicPeople(String name){
       this.name = name;
   }
   
   protected String getName(){  
       return name;
   }
   
   protectedvoidsetName(String name){  
       this.name = name;
   }

}


则会在Main中报错:
  
如果在com.cxh.test1中定一个类Man继承People,则可以在类Man中显示调用方法getName和setName:
package com.cxh.test1;

import com.cxh.test2.People;

publicclassManextendsPeople{

   publicMan(String name){
       super(name);
   }
   
   public String toString(){
       return getName();
   }
}

下面补充一些关于Java包和类文件的知识:
  1)Java中的包主要是为了防止类文件命名冲突以及方便进行代码组织和管理;
  2)对于一个Java源代码文件,如果存在public类的话,只能有一个public类,且此时源代码文件的名称必须和public类的名称完全相同,另外,如果还存在其他类,这些类在包外是不可见的。如果源代码文件没有public类,则源代码文件的名称可以随意命名。

丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:浅析Java中的访问权限控制
喜欢 (0)
[247507792@qq.com]
分享 (0)
勤劳的小蚂蚁
关于作者:
温馨提示:本文来源于网络,转载文章皆标明了出处,如果您发现侵权文章,请及时向站长反馈删除。

您必须 登录 才能发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00