前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >访问权限控制

访问权限控制

作者头像
Single
发布于 2018-04-17 08:00:01
发布于 2018-04-17 08:00:01
2.9K00
代码可运行
举报
运行总次数:0
代码可运行

访问权限控制又称「隐藏具体实现」,也就是说,我们可以通过它来决定某个类或者类中的成员在程序中的可见范围。例如,被修饰为 public 的元素在全局范围可见,而被修饰为 private 的元素只能可见于类的内部。

Java 的访问权限控制提供了四种不同的访问权限限定词,用于描述元素在程序中的可见范围。下面我们具体来看一看:

包的概念

Java 中最基本的文件单位就是类,每个类文件的文件名不允许重复,以保证类的唯一确定性,但是 Java 中有着成千上万的类,每新建一个类就需要定义一个与之前所有类不同的类名,想必光是找到一个不重复并且有点象征意义的名称就已经弹尽援绝了。

Java 引入包管理机制以解决这个问题,将一部分类圈到一起放入一个「文件夹」中,于是即便不同的文件夹下有着相同类名的类也不会构成冲突,大大降低了类的命名冲突概率。而这里所谓的「文件夹」官方点说,就是包。

而每个类都应该位于一个包下,每当新建一个类的时候,系统就将检索当前包下是否具有重名的类,而不再检索整个类路径。

有了包之后,对于类的定位与引用也发生了变化,一般需要使用「全限定类名」进行唯一确定。例如:java.lang.String,java.util.Date 等

其实对于包的命名并没有明确的约束,只是有一个不成文的惯例:包名称一般由一个域名的逆向顺序构成。例如:com.baidu.Test,net.csdn.Date 等。因为一般域名是唯一不重复的,所以利用域名来命名包的确实一个很好的策略。

所以 import 的作用很简单,就是省略包名,减少不必要的重复。不过它不是万能的,如果你要在一个 Java 文件中同时使用 java.util.Date 和 java.sql.Date 的话,那么 import 就只能适用其中的一个,另一个你还得用完整的类名。

类的访问修饰符

对于类而言,Java 只允许使用两种访问权限限定符进行修饰。(内部类除外)

  • public:被 public 修饰的类,于全局任何位置都是可见的
  • 默认修饰符:默认修饰符是没有具体的关键字对应的,只要你 Class 之前没有修饰符,就使用默认的修饰符,该修饰符指定类于包范围内可见

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//创建一个类,位于包 Class_AccessModefier 下
package Class_AccessModefier;

public class PublicClass {

}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//相同包的其他位置是可以访问的
package Class_AccessModefier;

public class Test {
    public static void main(String[] args){
        PublicClass publicClass = new PublicClass();
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//不同包下的其他位置也是可以访问的
package Others;

import Class_AccessModefier.PublicClass;

public class Test {
    public static void main(String[] args){
        PublicClass publicClass = new PublicClass();
    }
}

显然,一旦将一个类声明为 public,那么该类将在整个 Java 程序的任何位置可见。

再看一段代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package Class_AccessModefier;

class DefaultClass {
    
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//同包下的其他位置对于该类是可见的
package Class_AccessModefier;

public class Test {
    public static void main(String[] args){
        DefaultClass defaultClass = new DefaultClass();
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//不同包下无法访问类
package Others;

public class Test {
    public static void main(String[] args){
        //编译器找不到该类
        DefaultClass defaultClass = new DefaultClass();
    }
}

这里我们讨论的都是外部类,并不包含内部类,外部类只允许使用 public 和默认修饰符对类进行访问限定,而内部类会宽泛很多,我们以后再做详细描述。

类成员的访问修饰符

类成员包括类的字段属性和方法,针对它们,Java 中提供了四种不同的限定符限制可见范围。

  • public:被 public 修饰的方法或属性,可见性最高,于任何地方可访问
  • protected:被 protected 修饰的方法或属性,首先是包范围内可见,并且还允许不在同一个包的子类访问,也就是可以被子类继承过去
  • 默认:默认修饰符修饰的方法或属性对于同包下的任何位置是可见的
  • private:外部不可访问,但是该类的内部是可以访问的

我们看一些代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//我们定义了四个成员属性,并且具有不同的可见性
public class PublicClass {
    public String name = "hello world";
    protected String sex = "man";
    int age = 23;
    private String tel = "3234234234";
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//相同包下的访问情况
package Member_AccessModefier;

public class Test {
    public static void main(String[] args){
        PublicClass publicClass = new PublicClass();
        System.out.println(publicClass.name);
        System.out.println(publicClass.age);
        System.out.println(publicClass.sex);
        //编译器报错,不可访问的 tel 属性
        System.out.println(publicClass.tel);
    }
}

public 修饰的属性于任何位置都是可见的,这不用多说。

protected 修饰的 sex 也是可以访问的,原因是我们的 main 函数的 PublicClass 类位于同一个包下,所以自然是可访问的

未加修饰符的 age 属性也是能够被访问的,也是因为 main 函数的 PublicClass 类位于同一个包下

而 private 修饰的 tel 属性则不可见,说明 private 不允许外部的任何位置访问该属性,即便你是我的子类也不行

而同样的代码,我们置放于另一个包中,结果就是不同的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package Others;

import Member_AccessModefier.PublicClass;

public class Test {
    public static void main(String[] args){
        PublicClass publicClass = new PublicClass();
        System.out.println(publicClass.name);
        //编译器报错,不可访问的 age 属性
        System.out.println(publicClass.age);
        //编译器报错,不可访问的 sex 属性
        System.out.println(publicClass.sex);
        //编译器报错,不可访问的 tel 属性
        System.out.println(publicClass.tel);
    }
}

只有被修饰为 public 的 name 属性是可见的,其他都不可访问。

age 是默认修饰符修饰的,包可见范围,出了包范围即刻不可访问。

sex 是 protected 修饰的,既超出了包的范围,又没有继承目标类,所以不可见。

private 不用说,任何外部位置都不可见。

这里,一旦我们 Test 类继承了 PublicClass ,那么 sex 属性即刻变为可以访问,大家可以试试看。


文章中的所有代码、图片、文件都云存储在我的 GitHub 上:

(https://github.com/SingleYam/overview_java)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-04-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
八、JavaSE进阶之【Java 包机制与访问权限修饰符】。
包其实就是目录,特别是项目比较大,java 文件特别多的情况下,我们应该分目录管理,在 java中称为分包管理,包名称通常采用小写。 重点: 1、包最好采用小写字母 2、包的命名应该有规则,不能重复,一般采用公司网站逆序, 如:com.xxxxx.项目名称.模块名称com.xxxx.exam 3.package 必须放到 所有语句的第一行,注释除外
百思不得小赵
2022/12/01
2360
八、JavaSE进阶之【Java 包机制与访问权限修饰符】。
一文搞懂Java的 构造方法 和 访问权限
本文原创首发CSDN,本文链接https://blog.csdn.net/qq_41464123/article/details/107461710 ,作者博客https://blog.csdn.net/qq_41464123 ,转载请带上本链接,谢谢配合。
Designer 小郑
2023/08/01
2490
一文搞懂Java的 构造方法 和 访问权限
[ Java学习基础 ] Java的封装性与访问控制
      Java面向对象的封装性是通过对成员变量和方法进行访问控制实现的,访问控制分为4个等级:私有、默认、保护和公有,具体规则如下表:
Kevin_Zhang
2019/02/20
4660
[ Java学习基础 ] Java的封装性与访问控制
深入理解 Java 修饰符与封装:访问权限、行为控制与数据隐藏
Java 修饰符 用于控制类、属性、方法和构造函数的访问权限和行为。它们可以分为两组:
小万哥
2024/02/27
2980
深入理解 Java 修饰符与封装:访问权限、行为控制与数据隐藏
JAVA入门学习四
描述:有个这个关键字就是让有包的类对调用者可见,不用写全类名了; 比如我们前面在进行Scanner类示例化的对象来接收用户输入;
全栈工程师修炼指南
2020/10/23
6120
JAVA入门学习四
Java基础笔记10
10.01_面向对象(package关键字的概述及作用) A:为什么要有包 将字节码(.class)进行分类存放 B:包的概述 C:包的作用 10.02_面向对象(包的定义及注意事项) A:定义包的格式 package 包名; 多级包用.分开即可 B:定义包的注意事项 A:package语句必须是程序的第一条可执行的代码 B:package语句在一个java文件中只能有一个 C:如果没有package,默认表示无包名 C:案例演示 包的定义及注意事项 10.03_面向对象(带包的类编译和运行) A:
dreamkong
2018/06/21
5270
JavaSE(四)之接口、访问控制
上面我们学习了几个修饰符,在开发中经常会用的到,所以必须熟练的掌握。接下来我学习一下接口和访问控制。 一、接口 一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。 1.1、接口与抽象类的区别 抽象类也是类,除了可以写抽象方法以及不能直接new对象之外,其他的和普通类没有什么不一样的。接口已经另一种类型了,和类是有本质的区别的,所有不能用类的标准去衡量接口。 声明类的关键字是class,声明接
用户1195962
2018/01/18
9010
《Monkey Java》课程6.2之访问权限
本节课程将学习以下内容: Java当中的访问权限 软件包的导入 ---- Java当中的访问权限 一共分为4大类: public:公共权限,既可以修饰类,也可以修饰成员变量和成员函数; private:私有权限 default:包级别访问权限 protected:受保护权限 public权限 如果一个类不是public(公共)的,那么这个类不能被外部软件包访问; 如果一个类的成员变量或者方法不是public(公共)的,那么它们也不能被外部软件包访问; 没有任何限制,同一个包中,或者不同软件包当中,都
GitOPEN
2019/01/29
4780
【Java 类】001-访问修饰符、命名规范
总之,Java访问修饰符可以用来控制程序中各个部分的访问范围,从而实现类的封装,增强程序的可读性、重用性、可维护性和安全性。
訾博ZiBo
2025/01/06
3900
【Java 类】001-访问修饰符、命名规范
编程思想 之「访问权限控制」
访问权限控制的等级,从最大权限到最小权限依次为:public、protected、包访问权限(没有关键字)和private。
CG国斌
2019/05/26
6420
10(01)总结形式参数,包,修饰符,内部类
类,抽象类,接口的综合小练习 /* 教练和运动员案例(学生分析然后讲解) 乒乓球运动员和篮球运动员。 乒乓球教练和篮球教练。 为了出国交流,跟乒乓球相关的人员都需要学习英语。 请用所学知识: 分析,这个案例中有哪些抽象类,哪些接口,哪些具体类。 整个分析过程,我是通过画图讲解的。 */ //定义一个说英语的接口 interface SpeakEnglish { //说英语 public abstract void speak(); } //定义人的抽象类 abstract class P
Java帮帮
2018/03/15
7340
Java基础——package+权限修饰符+内部类
编译:在D盘下有Person_Test.java ,在D盘下打开dos命令行执行 javac -d . Person_Test.java 命令就会生成一个D:/com/heima/Person_Test.class
阿Q说代码
2021/05/13
2900
Java基础——package+权限修饰符+内部类
知识改变命运 第八集(下):Java中的类和对象
面向对象程序三大特性:封装、继承、多态。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说 就是套壳屏蔽细节。 比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器,USB插孔等,让用 户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU、显卡、内存等一些硬件元件。 对于计算机使用者而言,不用关心内部核心部件,比如主板上线路是如何布局的,CPU内部是如何设计的等,用户 只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时,在外部套上壳 子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可。 封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行 交互
用户11319080
2024/10/17
1130
知识改变命运 第八集(下):Java中的类和对象
java基础学习_面向对象(下)03_day10总结
============================================================================= ============================================================================= 涉及的知识点有: 1:方法的形式参数和方法的返回值的问题(理解)     (1)方法的形式参数为引用数据类型     (2)方法的返回值类型为引用数据类型     (3)链式编程 2:包(理解)     (1)包其实就是文件夹。     (2)包的作用     (3)包的定义(掌握)     (4)包的注意事项(掌握)     (5)带包的编译和运行     (6)Java中不同包下的类与类之间的访问 3:导包(掌握)     (1)导包的原因     (2)导包的格式     (3)package,import,class有没有顺序关系呢? 4:权限修饰符(掌握)     (1)权限修饰符的权限测试     (2)这四种权限修饰符在任意时刻只能出现一种。 5:类及其组成所使用的常见修饰符(理解)     (1)修饰符的分类     (2)常见的类及其组成所使用的修饰符       1.修饰类的       2.修饰成员变量的       3.修饰构造方法的       4.修饰成员方法的     (3)另外比较常见的修饰符组合规则 6:内部类(理解)     (1)把类定义在另一个类的内部,该类就被称为内部类。     (2)内部类的访问特点     (3)内部类的分类(内部类的位置)     (4)成员内部类     (5)成员内部类的面试题(填空)     (6)局部内部类     (7)匿名内部类(很重要掌握)     (8)匿名内部类在开发中的使用     (9)匿名内部类的面试题(补齐代码) ============================================================================= ============================================================================= 1:方法的形式参数和方法的返回值的问题(理解) (1)方法的形式参数为引用数据类型: 1.方法的形式参数为类名时:需要该类的对象。(匿名对象的时候已经讲过了) 2.方法的形式参数为抽象类名时:需要该抽象类的子类对象。 3.方法的形式参数为接口名时:需要该接口的实现类对象。 (2)方法的返回值类型为引用数据类型: 1.方法的返回值类型为类名时:返回的是该类的对象。 2.方法的返回值类型为抽象类名时:返回的是该类的子类对象。 3.方法的返回值类型为接口名时:返回的是该接口的实现类的对象。 (3)链式编程     对象.方法1().方法2().方法3(). ……… .方法n(); 这种用法: 其实     在方法1()调用完毕后,应该一个对象;     方法2()调用完毕后,应该返回一个对象。     方法3()调用完毕后,应该返回一个对象。     …………     方法n()调用完毕后,返回的可能是对象,也可以不是对象。 ----------------------------------------------------------------------------- 2:包(理解) (1)包其实就是文件夹。 (2)包的作用: A:区分同名的类(即把具有相同类名的类放到不同的包中)。 B:对类进行分类管理。 a:包按照功能分 cn.itcast.add 增加功能的包           AddStudent 增加学生的类           AddTeacher 增加老师的类 cn.itcast.delete 删除功能的包           DeleteStudent 删除学生的类           DeleteTeacher 删除老师的类 cn.itcast.update 修改功能的包           UpdateStudent 修改学生的类           UpdateTeacher 修改老师的类 cn.itcast.find 查找功能的包           FindStudent 查找学生的类           FindTeacher 查找老师
黑泽君
2018/10/11
3870
《JavaSE-第八章》-代码块与内部类
前言 本章介绍static成员,使用代码块初始化对象以及内部类。 博客主页:KC老衲爱尼姑的博客主页 博主的github,平常所写代码皆在于此 共勉:talk is cheap, show m
用户10517932
2023/10/07
1740
《JavaSE-第八章》-代码块与内部类
Java-访问修饰符
类只能用default(什么也不写),public 来修饰。对与用default 修饰的类只能在同一包下进行访问。类还可以使用abstract ,表示该类是抽象类,不能实例化该类。类还可以用final 来修饰。
用户7886150
2020/12/18
5100
Java研发面试题『八部曲』——从第一步开始
Java中主要有如下几种类型的变量 局部变量 类变量(静态变量)-- 属于类 成员变量(非静态变量)-- 属于对象
本人秃顶程序员
2019/10/07
6140
Java研发面试题『八部曲』——从第一步开始
JAVA零基础小白学习教程之day09-内部类&权限&final&静态
是内部类的简化写法。它的本质是一个带具体实现的 父类或者父接口的 匿名的 子类对象。
张哥编程
2024/12/13
1540
JAVA零基础小白学习教程之day09-内部类&权限&final&静态
第十三天 面向对象-final static 匿名对象内部类包代码块【悟空教程】
第13天 面向对象 第1章 面向对象其他知识点 1.1 final与static关键字 1.1.1 final关键字 1.1.1.1 final概念 继承的出现提高了代码的复用性,并方便开发。但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写。可是当子类继承了这些特殊类之后,就可以对其中的方法进行重写,那怎么解决呢? 要解决上述的这些问题,需要使用到一个关键字final,final的意思为最终,不可变。final是个修饰符,它可以用来修饰类,类的成员,以及局
Java帮帮
2018/06/11
4210
【Java 基础】类和对象(构造&this&封装&static&代码块)
类:把具有相同属性和行为的一类对象抽象为类。类是抽象概念,如人类、犬类等,无法具体到每个实体。
IsLand1314
2024/10/15
1890
【Java 基础】类和对象(构造&this&封装&static&代码块)
相关推荐
八、JavaSE进阶之【Java 包机制与访问权限修饰符】。
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验