当前位置: 首页 > news >正文

浅析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:

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

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类是可见的。

  程序运行结果:

o_Java_Access001.jpg

例子2:

People.java

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类中的提示的错误:

o_Java_Access002.jpg

  提示Peolple类在Main类中不可视。从这里就可以看出,如果用默认访问权限去修饰一个类,该类只对同一个包中的其他类可见,对于不同包中的类是不可见的。

  正如上图的快速修正提示所示,将People类的默认访问权限更改为public的话,People类对于Main类便可见了。

2.修饰类的方法和变量

  默认访问权限(包访问权限):如果一个类的方法或变量被包访问权限修饰,也就意味着只能在同一个包中的其他类中显示地调用该类的方法或者变量,在不同包中的类中不能显示地调用该类的方法或变量。

  private:如果一个类的方法或者变量被private修饰,那么这个类的方法或者变量只能在该类本身中被访问,在类外以及其他类中都不能显示地进行访问。

  protected:如果一个类的方法或者变量被protected修饰,对于同一个包的类,这个类的方法或变量是可以被访问的。对于不同包的类,只有继承于该类的类才可以访问到该类的方法或者变量。

  public:被public修饰的方法或者变量,在任何地方都是可见的。

下面再通过几个例子来看一下它们作用域类的方法和变量时的区别:

例3:

Main.java没有变化

People.java

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类不在同一个包中:

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类中会提示错误:

o_Java_Access003.jpg

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

例4:

People.java

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类处于不同包中:

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中报错:

o_Java_Access004.jpg

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

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类,则源代码文件的名称可以随意命名。

转载于:https://www.cnblogs.com/andy-zhou/p/5331406.html

相关文章:

  • 优步每周结算时间:每周二下午4点!
  • 获取java类和方法名
  • ISBN
  • 解决john不能开多个进程的问题
  • StringBuilder与StringBuffer
  • 欧拉赞词
  • 或许是 Nginx 上配置 HTTP2 最实在的教程了
  • django之创建第7-6-第三种传值方式
  • MySQL之数据类型与操作数据表
  • setTimeOut
  • 关于 古人劝学 --写的真心是好 真的有收获
  • [CSS3备忘] transform animation 等
  • codeforces 660C C. Hard Process(二分)
  • 广搜最短路(最短时间到达目的地),POJ(3669)
  • 06章 初始继承和多态
  • Codepen 每日精选(2018-3-25)
  • Javascript编码规范
  • Java深入 - 深入理解Java集合
  • nginx 负载服务器优化
  • Python进阶细节
  • Spring-boot 启动时碰到的错误
  • SpringBoot 实战 (三) | 配置文件详解
  • Vue2.0 实现互斥
  • vue-router 实现分析
  • Zsh 开发指南(第十四篇 文件读写)
  • 对象引论
  • 机器学习中为什么要做归一化normalization
  • 开源SQL-on-Hadoop系统一览
  • 如何选择开源的机器学习框架?
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • ​​​​​​​​​​​​​​Γ函数
  • ​flutter 代码混淆
  • ​马来语翻译中文去哪比较好?
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (javascript)再说document.body.scrollTop的使用问题
  • (pojstep1.3.1)1017(构造法模拟)
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (二)Linux——Linux常用指令
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (七)c52学习之旅-中断
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)jdk与jre的区别
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .net framework4与其client profile版本的区别
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET 服务 ServiceController
  • .net 托管代码与非托管代码
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • /var/log/cvslog 太大