浅析Java中的访问权限控制

简介:

浅析Java中的访问权限控制

  今天我们来一起了解一下Java语言中的访问权限控制。在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制。考虑两个场景:

  场景1:工程师A编写了一个类ClassA,但是工程师A并不希望ClassA被该应用中其他所用的类都访问到,那么该如何处理?

  场景2:如果工程师A编写了一个类ClassA,其中有两个方法fun1、fun2,工程师只想让fun1对外可见,也就是说,如果别的工程师来调用ClassA,只可以调用方法fun1,那么该怎么处理?

  此时,访问权限控制便可以起到作用了。

  在Java中,提供了四种访问权限控制:默认访问权限(包访问权限),public,private以及protected。

  注意,上述四种访问权限,只有默认访问权限和public能够用来修饰类。修饰类的变量和方法四种权限都可以。(本处所说的类针对的是外部类,不包括内部类)

  下面就分别针对修饰类和修饰类的成员来讲述这四种访问权限控制。

1.修饰类

  默认访问权限(包访问权限):用来修饰类的话,表示该类只对同一个包中的其他类可见。

  public:用来修饰类的话,表示该类对其他所有的类都可见。

  下面通过几个例子来看一下两者的区别:

例1:

Main.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package  com.cxh.test1;
 
 
public  class  Main {
 
     /**
      * @param args
      */
     public  static  void  main(String[] args) {
         // TODO Auto-generated method stub
         
         People people =  new  People( "Tom" );
         System.out.println(people.getName());
     }
 
}

People.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package  com.cxh.test1;
 
class  People {            //默认访问权限(包访问权限)
 
     private  String name =  null ;
     
     public  People(String name) {
         this .name = name;
     }
     
     public  String getName() {
         return  name;
     }
     
     public  void  setName(String name) {
         this .name = name;
     }
}

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

  程序运行结果:

  

例子2:

People.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package  com.cxh.test2;
 
class  People {            //默认访问权限(包访问权限)
 
     private  String name =  null ;
     
     public  People(String name) {
         this .name = name;
     }
     
     public  String getName() {
         return  name;
     }
     
     public  void  setName(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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package  com.cxh.test1;
 
public  class  People {      
 
     private  String name =  null ;
     
     public  People(String name) {
         this .name = name;
     }
     
     String getName() {     //默认访问权限(包访问权限)
         return  name;
     }
     
     void  setName(String name) {    //默认访问权限(包访问权限)
         this .name = name;
     }
}

  此时在Main类是可以显示调用方法getName和setName的。

但是如果People类和Main类不在同一个包中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package  com.cxh.test2;     //与Main类处于不同包中
 
public  class  People {      
 
     private  String name =  null ;
     
     public  People(String name) {
         this .name = name;
     }
     
     String getName() {     //默认访问权限(包访问权限)
         return  name;
     }
     
     void  setName(String name) {    //默认访问权限(包访问权限)
         this .name = name;
     }
}

  此时在Main类中会提示错误:

  

  由此可以看出,如果用默认访问权限来修饰类的方法或者变量,则只能在同一个包的其他类中进行访问。

 例4:

People.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package  com.cxh.test1;   
 
public  class  People {      
 
     private  String name =  null ;
     
     public  People(String name) {
         this .name = name;
     }
     
     protected  String getName() {   
         return  name;
     }
     
     protected  void  setName(String name) {  
         this .name = name;
     }
}

  此时是可以在Main中显示调用方法getName和setName的。

如果People类和Main类处于不同包中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package  com.cxh.test2;   
 
public  class  People {      
 
     private  String name =  null ;
     
     public  People(String name) {
         this .name = name;
     }
     
     protected  String getName() {   
         return  name;
     }
     
     protected  void  setName(String name) {  
         this .name = name;
     }
}

  则会在Main中报错:

  

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package  com.cxh.test1;
 
import  com.cxh.test2.People;
 
public  class  Man  extends  People{
 
     public  Man(String name){
         super (name);
     }
     
     public  String toString() {
         return  getName();
     }
}

  下面补充一些关于Java包和类文件的知识:

  1)Java中的包主要是为了防止类文件命名冲突以及方便进行代码组织和管理;

  2)对于一个Java源代码文件,如果存在public类的话,只能有一个public类,且此时源代码文件的名称必须和public类的名称完全相同,另外,如果还存在其他类,这些类在包外是不可见的。如果源代码文件没有public类,则源代码文件的名称可以随意命名。


本文转载自海 子博客园博客,原文链接:http://www.cnblogs.com/dolphin0520/p/3734915.html如需转载自行联系原作者

相关文章
|
1月前
|
Java 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
335 5
|
3月前
|
存储 安全 Java
java: 无法访问org.springframework.ldap.core.LdapTemplate
java: 无法访问org.springframework.ldap.core.LdapTemplate
131 9
|
5月前
|
缓存 Java 数据库
Java 访问修饰符使用方法与组件封装方法详细说明
本文详细介绍了Java中访问修饰符(`public`、`private`、`protected`、默认)的使用方法,并结合代码示例讲解了组件封装的核心思想与实现技巧。内容涵盖数据封装、继承扩展、模块化设计与接口隔离等关键技术点,帮助开发者提升代码的可维护性与安全性,适用于Java初学者及进阶开发者学习参考。
139 1
|
8月前
|
存储 算法 安全
Java对象创建和访问
Java对象创建过程包括类加载检查、内存分配(指针碰撞或空闲列表)、内存初始化、对象头设置及初始化方法执行。访问方式有句柄和直接指针两种,前者稳定但需额外定位,后者速度快。对象创建涉及并发安全、垃圾回收等机制。
121 0
Java对象创建和访问
|
10月前
|
NoSQL JavaScript 前端开发
Java访问MongoDB
Java访问MongoDB
154 21
|
10月前
|
SQL Java 数据库连接
【潜意识Java】深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
1649 1
|
存储 Java
深入理解java对象的访问定位
这篇文章深入探讨了Java对象的访问定位机制,比较了使用句柄和直接指针两种主流的对象访问方式,并指出了它们各自的优势,例如句柄访问在对象移动时的稳定性和直接指针访问的速度优势。
146 1
深入理解java对象的访问定位
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
242 3
|
SQL Java 数据库连接
打破瓶颈:利用Java连接池技术提升数据库访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,避免了频繁的连接建立和断开,显著提升了数据库访问效率。常见的连接池库包括HikariCP、C3P0和DBCP,它们提供了丰富的配置选项和强大的功能,帮助优化应用性能。
253 2