浅析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如需转载自行联系原作者

相关文章
|
10天前
|
存储 Java 关系型数据库
java: 无法访问org.springframework.context.ConfigurableApplicationContext
`亲测可用,之前搜索了很多博客,啥样的都有,就是不介绍报错以及配置用处,根本不懂照抄那些配置是干啥的,稀里糊涂的按照博客搭完也跑不起来,因此记录这个。` `项目背景`:公司项目当前采用http协议+shiro+mysql的登录认证方式,而现在想支持ldap协议认证登录然后能够访问自己公司的项目网站。 `举例说明`:假设我们公司有自己的门户网站,现在我们收购了一家公司,他们数据库采用ldap存储用户数据,那么为了他们账户能登陆我们公司项目所以需要集成,而不是再把他们的账户重新在mysql再创建一遍,万一人家有1W个账户呢,不累死了且也不现实啊。
28 11
|
9天前
|
安全 Java 编译器
java访问字段
java访问字段
19 6
|
6天前
|
安全 Java 编译器
java访问类字段
java访问类字段
|
6天前
|
安全 Java 开发者
Java修饰符与封装:理解访问权限、行为控制与数据隐藏的重要性
Java中的修饰符和封装概念是构建健壯、易维护和扩展的Java应用程序的基石。通过合理利用访问权限修饰符和非访问修饰符,开发者能够设计出更加安全、灵活且高效的代码结构。封装不仅是面向对象编程的核心原则之一,也是提高软件项目质量和可维护性的关键策略。
10 1
|
10天前
|
存储 Java 关系型数据库
java: 无法访问org.springframework.ldap.core.LdapTemplate
`亲测可用,之前搜索了很多博客,啥样的都有,就是不介绍报错以及配置用处,根本不懂照抄那些配置是干啥的,稀里糊涂的按照博客搭完也跑不起来,因此记录这个。` `项目背景`:公司项目当前采用http协议+shiro+mysql的登录认证方式,而现在想支持ldap协议认证登录然后能够访问自己公司的项目网站。 `举例说明`:假设我们公司有自己的门户网站,现在我们收购了一家公司,他们数据库采用ldap存储用户数据,那么为了他们账户能登陆我们公司项目所以需要集成,而不是再把他们的账户重新在mysql再创建一遍,万一人家有1W个账户呢,不累死了且也不现实啊。
12 1
|
20天前
|
SQL JavaScript 前端开发
基于Java访问Hive的JUnit5测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Java、来开发Hive应用的方法,产生的代码如下
49 6
|
20天前
|
NoSQL JavaScript Java
Java Python访问MongoDB
Java Python访问MongoDB
18 4
|
2月前
|
Java
【Java基础面试三】、说一说你对Java访问权限的了解
这篇文章介绍了Java中的四种访问权限:private、default(无修饰符时的访问权限)、protected和public,以及它们分别在修饰成员变量/方法和类时的不同访问级别和规则。
【Java基础面试三】、说一说你对Java访问权限的了解
|
2月前
|
算法 Java 测试技术
java 访问ingress https报错javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version
java 访问ingress https报错javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version
|
2月前
|
Java 开发工具
【Azure Developer】Java代码访问Key Vault Secret时候的认证问题,使用 DefaultAzureCredentialBuilder 或者 ClientSecretCredentialBuilder
【Azure Developer】Java代码访问Key Vault Secret时候的认证问题,使用 DefaultAzureCredentialBuilder 或者 ClientSecretCredentialBuilder
下一篇
无影云桌面