Java——访问控制(概念理解+应用举例)

本文涉及的产品
访问控制,不限时长
简介: Java——访问控制(概念理解+应用举例)

1.关于Java中的访问控制


Java语言中,通过访问(权限)控制符来隐藏类中的具体实现。类不但将数据结构和对数据结构进行的访问和操作进行类封装;而且对封装后的成员通过访问控制符,该隐藏的隐藏,该暴露的暴露。达到访问的安全性、类的可维护性、类数据的完整性。
通过访问控制符可以实现良好的类封装。访问控制符与继承无关,即不可以继承。

访问控制的三个原因:访问安全、可维护性、数据的完整性。在类中可以出现访问控制符的三处单元:类的声明;方法的声明;字段的声明。

Java中,一共有四类访问控制符,分别是publicprotected、默认(defaultfriendly)和private

这四者的访问级别从高到低依次是:public > protected > 默认(defaultfriendly> private。见下图👇👇👇

低依次是:public > protected > 默认(default、friendly) > private。见下图👇👇👇


那么既然说到了访问控制,就不仅仅是对类来说,同时也会涉及到包,在之前的博文中也讲到过,Java中的包其实就是一个文件夹,但是包实际上也是一个访问控制的逻辑单元:库单元。见下图👇👇👇


2.四类访问控制符的作用域


·       2.1 public

public定义的为公共属性或方法,任何地方都可以进行访问!!! 


·       2.2 protected

protected定义的为受保护的属性或方法,同一个包中的类可以进行访问,不同包中的子类也可以进行访问!!! 


2.3 默认(包的访问权限)


默认(defaultfriendly)定义的为缺省属性或方法,同一个包中的类可以进行访问,不同包中的类无法进行访问!!! 

 2.4 private


private定义的为私有属性或方法,只有在包含private对应的类中才可以进行访问,类外无法进行访问!!! 

3.访问控制符的使用原则


考虑到安全性、可维护性、完整性以及高内聚低偶合,尽可能使用低级别的访问控制符。

访问控制符从高到低的级别(范围):publicprotected、默认、private

应尽可能地总是将字段指定为 private,减少类间数据结构耦合;否则,将产生高耦合,耦合的数据结构不具有可维护性。类中的方法实现与访问控制符无关,总是隐藏的,具有可维护性。 

下面,我们举几个例子,来更好的理解这四类访问控制符!!!👇👇👇


Example 1:同一个包下的访问


我们首先创建一个包,包名为:p1,并且在这个包下创建三个类文件,分别为公共类MyClass1、(默认)缺省类MyClass2以及包含main方法的公共类Test,详细内容请看下面的代码:👇👇👇

package p1;
public class MyClass1 {
  public int a=5;
  private int b=10;
  protected int c=20;
  int d=30;
  public void func1() {
    System.out.println("func1");
  }
  private void func2() {
    System.out.println("func2");
    System.out.println(b);
  }
  protected void func3() {
    System.out.println("func3");
  }
  void func4() {
    System.out.println("func4");
  }
}
package p1;
class MyClass2 {
  public void func1() {
    System.out.println("func1 of MyClass2");
  }
}
package p1;
public class Test {
  public static void main(String[] args) {
    MyClass1 obj1=new MyClass1();
    System.out.println(obj1.a);//a是公共属性,任何地方都可以访问
    //System.out.println(obj1.b);//本行代码会报错!!!b是私有属性,类MyClass1外无法访问
    System.out.println(obj1.c);//c是受保护属性,同一个包下的类可以访问,其他包中的子类也可以访问
    System.out.println(obj1.d);//d是缺省属性,同一个包下的类可以访问
    //所谓缺省,就是指系统默认的方法
    obj1.func1();//func1()是公共方法,任何地方都可以访问
    //obj1.func2();//func2()为私有方法,类MyClass1外无法访问
    obj1.func3();//func3()是受保护方法,同一包中的类可以访问,其他包中的子类也可以访问
    obj1.func4();//func4()是缺省方法,同一包中的类可以访问
    MyClass2 obj2=new MyClass2();
    obj2.func1();//同一个包中的缺省访问控制类可以进行访问
  }
}

在第一块代码中,我们分别定义这四类访问控制符对应的属性及方法,并且为其赋值。

在第二块代码中,仅仅是定义了一个缺省类,以及一个公共方法。

在最后这个代码块中,我们利用前文对访问控制符的理解,来创建对应的类对象,用对象来调用这些属性及方法。

(详细的注释,我已经写在代码中了,大家可以仔细理解),下面是程序运行的结果:👇👇👇

 Example 2:不同包之间的非继承访问

我们在第一个例子的基础上,再新创建一个包,包名为:p2,在这个包下,我们首先使用 import p1.MyClass1; 来将包p1中的公共类MyClass1进行导入,而缺省类MyClass2就无法进行导入,原因是:缺省类在对应包外不可见!!!之后,我们在包p2下,创建一个包含main方法的类文件Test,详细内容大家来看下面的代码:👇👇👇

package p2;//不同包间的非继承访问
import p1.MyClass1;
//import p1.MyClass2;报错!!!不能导入不同包中的缺省类,缺省类在对应包外不可见
public class Test {
  public static void main(String[] args) {
    MyClass1 obj1=new MyClass1();
    System.out.println(obj1.a);//a为公共属性,任何地方都可以访问
    //System.out.println(obj1.b);//报错!!!b为私有属性,类外无法访问
    //System.out.println(obj1.c);//报错!!!c是受保护属性,不同包中的非子类无法访问
    //System.out.println(obj1.d);//报错!!!d是缺省属性,不同包中的类不能访问
    obj1.func1();//func1()是公共方法,任何地方都可以访问
    //obj1.func2();//报错!!!func2()为私有方法,类外无法访问
    //obj1.func3();//报错!!!func3()为受保护方法,不同包中的非子类无法访问
    //obj1.func4();//报错!!!func4()是缺省方法,不同包中的类不能访问
    //MyClass2 obj2=new MyClass2();//报错!!!不可以访问不同包中的缺省类
  }
}

代码的解释,我也已经将注释写的挺清楚的了,大家可以参考着理解一下,下面是程序的运行结果:👇👇👇 



 Example 3:不同包之间的继承访问


第三个例子中,我们同样是在第一个例子的基础上,再新创建一个包,包名为:p3那么在这个包下,我们仍然是先使用 import p1.MyClass1; 来将包p1中的公共类MyClass1进行导入,而缺省类MyClass2就无法进行导入,原因是:缺省类在对应包外不可见!!!之后,我们在包p3下,创建一个包含main方法的类文件Test,但是这里我们使用类Test去继承包p1中的类MyClass1。详细内容,我们来看下面的代码:👇👇👇

package p3;//不同包间的继承访问
import p1.MyClass1;
//import p1.MyClass2;报错!!!不能导入不同包中的缺省类,缺省类在对应包外不可见
public class Test extends MyClass1 {
  public static void main(String[] args) {
    Test obj1=new Test();
    System.out.println(obj1.a);//a为公共属性,任何地方都可以访问
    //System.out.println(obj1.b);//报错!!!b为私有属性,类外无法访问
    System.out.println(obj1.c);//c为受保护属性,不同包中的子类可以访问
    //System.out.println(obj1.d);//报错!!!d是缺省属性,不同包中的类不能访问
    obj1.func1();//func1()为公共方法,任何地方都可以访问
    //obj1.func2();报错!!!func2()是私有方法,类外无法访问
    obj1.func3();//func3()为受保护方法,不同包中的子类可以访问
    //obj1.func4();//func4()为缺省方法,不同包中的类无法访问
  }
}

在这里,我们的类Test继承了类MyClass1,所以不仅仅是public定义的公共属性及方法可以访问,而且protected定义的受保护的属性及方法,也可以在其他包中的子类下进行访问,大家可以理解一下代码中的注释。程序的运行结果如下:👇👇👇


那么,以上就是博主总结的Java语言中访问控制的相关内容,其实主要就是那四个访问控制符的理解和使用,博文中也许会有表达不严谨之处、又或是错误,也希望大家可以指出纠正,感谢CSDN的博友们,感谢感谢!!!😀😀😀

相关实践学习
消息队列+Serverless+Tablestore:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
云安全基础课 - 访问控制概述
课程大纲 课程目标和内容介绍视频时长 访问控制概述视频时长 身份标识和认证技术视频时长 授权机制视频时长 访问控制的常见攻击视频时长
相关文章
|
1月前
|
人工智能 安全 Java
Java和Python在企业中的应用情况
Java和Python在企业中的应用情况
52 7
|
1天前
|
存储 Java 程序员
Java的基础概念一
### Java编程基础简介 #### 一、注释 注释用于解释代码,不会参与编译和运行。Java支持三种注释: - **单行注释**:以 `//` 开头。 - **多行注释**:以 `/* ... */` 包围。 - **文档注释**:通常用于生成开发文档。 #### 二、关键字 关键字是被Java赋予特定含义的英文单词,全部小写,且在代码编辑器中有特殊颜色标记。常用的如 `class` 表示定义一个类。
Java的基础概念一
|
2天前
|
安全 算法 Java
Java CAS原理和应用场景大揭秘:你掌握了吗?
CAS(Compare and Swap)是一种乐观锁机制,通过硬件指令实现原子操作,确保多线程环境下对共享变量的安全访问。它避免了传统互斥锁的性能开销和线程阻塞问题。CAS操作包含三个步骤:获取期望值、比较当前值与期望值是否相等、若相等则更新为新值。CAS广泛应用于高并发场景,如数据库事务、分布式锁、无锁数据结构等,但需注意ABA问题。Java中常用`java.util.concurrent.atomic`包下的类支持CAS操作。
18 2
|
24天前
|
缓存 Java 开发者
Java多线程并发编程:同步机制与实践应用
本文深入探讨Java多线程中的同步机制,分析了多线程并发带来的数据不一致等问题,详细介绍了`synchronized`关键字、`ReentrantLock`显式锁及`ReentrantReadWriteLock`读写锁的应用,结合代码示例展示了如何有效解决竞态条件,提升程序性能与稳定性。
98 6
|
23天前
|
监控 Java 数据库连接
Java线程管理:守护线程与用户线程的区分与应用
在Java多线程编程中,线程可以分为守护线程(Daemon Thread)和用户线程(User Thread)。这两种线程在行为和用途上有着明显的区别,了解它们的差异对于编写高效、稳定的并发程序至关重要。
29 2
|
1月前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
53 6
|
29天前
|
关系型数据库 MySQL Java
MySQL索引优化与Java应用实践
【11月更文挑战第25天】在大数据量和高并发的业务场景下,MySQL数据库的索引优化是提升查询性能的关键。本文将深入探讨MySQL索引的多种类型、优化策略及其在Java应用中的实践,通过历史背景、业务场景、底层原理的介绍,并结合Java示例代码,帮助Java架构师更好地理解并应用这些技术。
31 2
|
1月前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
1月前
|
Java 测试技术 API
Java 反射机制:深入解析与应用实践
《Java反射机制:深入解析与应用实践》全面解析Java反射API,探讨其内部运作原理、应用场景及最佳实践,帮助开发者掌握利用反射增强程序灵活性与可扩展性的技巧。
95 4
|
1月前
|
Java BI API
Java Excel报表生成:JXLS库的高效应用
在Java应用开发中,经常需要将数据导出到Excel文件中,以便于数据的分析和共享。JXLS库是一个强大的工具,它基于Apache POI,提供了一种简单而高效的方式来生成Excel报表。本文将详细介绍JXLS库的使用方法和技巧,帮助你快速掌握Java中的Excel导出功能。
70 6