Java中的访问控制权限
简介
Java中为什么要设计访问权限控制机制呢?主要作用有两点:
(1)为了使用户不要触碰那些他们不该触碰的部分,这些部分对于类内部的操作时必要的,但是它并不属于客户端程序员所需接口的一部分。
(2)为了让类库设计者可用更改类的内部工作方式,而不必担心会对用户造成重大影响。
Java中的访问权限控制的等级,按照权限从大到小依次为:
Public -> protected -> 包访问权限(没有权限修饰词)-> private。
包(package)
Java中包(package)的概念和C++中命名空间(namespace)的概念很类似,都可以限制类的作用域。二者最大的差别在于,Java中的包隐式地指明了类的树形层级结构(同时也是Java源码文件的目录结构)。这样做的好处在于:可以通过文件系统中对于文件路径唯一性的要求来限制类的唯一性。
代码组织
编写一个Java源代码文件(.java文件)时,此文件通常被称为编译单元。在编译单元内最多允许有一个public类,且该类的名称必须与文件名完全相同(包括大小写)。
编译一个.java文件时,在.java文件中的每个类都会有一个.class输出文件,这个文件名和类名是相同的。Java可运行程序是一组可以打包并压缩为一个Java文档文件(JAR包,使用Java的jar文档生成器)的.class文件。Java解释器负责这些文件的查找、装载和解释。
类库实际上是一组类文件。其中每个.java文件最多允许有一个public类,以及任意数量的非public类。因此,每个文件都有一个构件。如果要将这些构件(每个构建有一个.java文件和若干个.class文件)组织起来,形成不同的群组,可以使用Java中的关键字package。
包(package)的作用
(1) 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
(2) 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
(3) 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
创建包
Java中,使用package关键字来指定代码所属的包(命名空间)。
语法格式:
|
package pkg1[.pkg2[.pkg3…]]; |
注意点:
(1) 包的名字隐含地指出了代码的目录结构。
(2) 同一目录下的public类名(同时也是java文件名)应该是独一无二的。
(3) 包声明应该在源文件的第一行,每个源文件只能有一个包声明,这个文件中的每个类型都应用于它。
(4) 如果一个源文件中没有使用包声明,那么其中的类,函数,枚举,注释等将被放在一个无名的包(unnamed package)中。
(5) package的名字一般全是小写字母。
例如:
查看java.util.ArrayList类的源码可以看到文件第一行代码为:
|
package java.util; |
它的代码目录结构就是java/util/ArrayList.java
导入包
Java中,使用import关键字来导入包。
语法格式:
|
import package1[.package2…].(classname|*); |
例:
还是以java.util.ArrayList来举例。如果以一个了类完整路径的方式来使用它,十分不方便。
|
java.util.ArrayList<String> list = new java.util.ArrayList<String>(); |
如果想要省略前面的路径,可以使用import关键字。
|
import java.util.ArrayList; |
文件中使用了import导入包后,前面的声明list的代码就可以简化如下:
|
ArrayList<String> list = new ArrayList<String>(); |
访问权限修饰词
package:包访问权限
如果不提供任何访问权限修饰词,则意味着它是包访问权限。
默认访问权限没有任何关键字,但通常是指包访问权限(有时也表示为friendly,有点像C++中的友元概念)。这意味着包中所有其他类都可以访问这个成员或方法,但是这个包之外的所有类不可以访问。
例:
com.notes.packages.test.Info
|
package com.notes.packages.test; publicclass Info { void print() { System.out.println("default method -- print()"); } } |
com.notes.packages.test.PublicDemo01
|
package com.notes.packages.test; publicclass PublicDemo01 { publicstaticvoid main(String[] args) { Info x = new Info(); x.print(); } } |
PublicDemo01和Info在同一个包下,可以访问Info的default级别的方法——print()。
com.notes.packages.PublicDemo02
|
package com.notes.packages; import com.notes.packages.test.Info; publicclass PublicDemo02 { publicstaticvoid main(String[] args) { Info x = new Info(); // x.print(); // Error } } |
PublicDemo02和Info不在一个包下,不可以访问Info的包访问权限级别的方法——print()。
public:接口访问权限
使用public关键字,就意味着被声明的成员或方法对所有人都是可以访问的。
例:如果将default级别权限例子中的print()方法权限设为public,则PublicDemo02可以访问。
|
package com.notes.packages.test; publicclass Info { publicvoid print() { System.out.println("public method -- print()"); } } |
private:无法访问
使用private关键字,就意味着被声明的成员或方法,除了本类,其他任何类都无法访问。
应用场景:单例模式
protected:继承访问权限
新类(称之子类或派生类)通过继承可以复用一个现有类(称之父类或基类),然后扩展基类的成员、方法。有时,基类的创建者会希望某个特定成员,将它的访问权限赋予派生类而不是所有类。public无法做到这一点,为此,引入了protected来完成这一工作。protected也提供包访问权限,也就是说,派生类以及相同包内的其他类都可以访问protected成员或方法。
例:子类继承父类后,可以访问父类的protected成员。
|
class Father { private String a = "private"; protected String b = "protected"; public String c = "public"; }; class Son extends Father { publicvoid print() { // System.out.println("element a:" + super.a); // Error System.out.println("element b:" + super.b); System.out.println("element c:" + super.c); } } publicclass ProtectedDemo01 { publicstaticvoid main(String args[]) { Son sub = new Son(); sub.print(); } }; |
访问权限修饰词的注意点
前面各个例子中展示了类的成员、方法都可以用各种权限修饰词来修饰。
除此之外,还有一些需要注意的点:
(1) 静态成员、静态方法的权限修饰词的用法和普通成员、方法一样。
(2) 类虽然也可以被修饰词修饰,但是不可以用private、protected两个权限修辞词。
(3) 有些书中将包访问权限又叫做默认访问权限。个人不建议这么去记,因为这很容易与Java Se8中新特性——default关键字混淆。这个关键字只能用于Interface,作用是允许程序员在Interface中定义接口的默认具体实现(以往的JDK版本是不允许这样的,你只能在接口中声明方法)。
Java中的访问控制权限的更多相关文章
- 详解Java中的访问控制修饰符(public, protected, default, private)
Java中的访问控制修饰符已经困惑笔者多时,其中较复杂的情况一直不能理解透彻.今天下定决心,系统.全面地研究Java中的访问控制修饰符的所有方面,并整理成这篇文章,希望有同样疑惑的读者读完后能有所收获 ...
- Java学习笔记十九:Java中的访问控制修饰符
Java中的访问控制修饰符 一:Java修饰符的种类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class Hello ...
- 浅析Java中的访问权限控制
浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但 ...
- Java类成员访问控制权限
类成员访问控制权限 在JAVA中有四种访问控制权限,分别为:private, default, protected, public 1.Private 如果一个成员方法或变量名前使用了private, ...
- JAVA基础之访问控制权限
包:库单元 1.当编写一个Java源代码文件时,此文件通常被称为编译单元(有时也被称为转译单元). 2.每个编译单元都必须有一个后缀名.java,而在编译单元内则可以有一个public类,该类名称必须 ...
- (转)浅析Java中的访问权限控制
原文地址: http://www.cnblogs.com/dolphin0520/p/3734915.html 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下 ...
- Java中的访问权限细谈
一.成员访问控制权限 作用域 当前类 当前包 子孙类 其他包 public √ √ √ √ protected √ √ √ X private √ X X X default √ √ 当前包下继承可以 ...
- [转] Java中的访问控制
可见/访问性 在同一类中 同一包中 不同包中 同一包子类中 不同包子类中 public yes yes yes yes yes protected yes yes no ...
- java进阶(6)--访问控制权限
一.四种访问控制权限 二.举例同包下访问权限
随机推荐
- 怎么可以让div自适应屏幕的高度?(已解决)
主要解决问题的方法是用JS脚本. 先看布局, 一个div是首部,另一个div是主体,主体包含左侧菜单和右侧内容. 我想把主体div的高度自适应屏幕剩余区域,怎么做? 首先,获取可见区域的高度,docu ...
- SVN Server for Migration
SVN Server: http://mxsuse01/svn/repos/erp/Oracle_EMS Report SVN (Put to SVN Sort) 1. *.RDF 2. *CP.LD ...
- java读写Properties属性文件公用方法
Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件. 它提供了几个主要的方法: 1. getProperty ( String ...
- 通杀所有系统的硬件漏洞?聊一聊Drammer,Android上的RowHammer攻击
通杀所有系统的硬件漏洞?聊一聊Drammer,Android上的RowHammer攻击 大家肯定知道前几天刚爆出来一个linux内核(Android也用的linux内核)的dirtycow漏洞.此洞可 ...
- 轻量级通信引擎StriveEngine —— C/S通信demo(2) —— 使用二进制协议 (附源码)
在网络上,交互的双方基于TCP或UDP进行通信,通信协议的格式通常分为两类:文本消息.二进制消息. 文本协议相对简单,通常使用一个特殊的标记符作为一个消息的结束. 二进制协议,通常是由消息头(Head ...
- Css 动画的回调
在做项目中经常会遇到使用动画的情况.以前的情况是用js写动画,利用setTimeout函数或者window.requestAnimationFrame()实现目标元素的动画效果.虽然后者解决了刷新频率 ...
- AngularJs项目文件以及文件夹结构
app/ ----- Libs/ // references for all libs ---------- angular.js ---------- angular-route.js ----- ...
- [ASP.NET MVC 小牛之路]01 - 理解MVC模式
本人博客已转移至:http://www.exblr.com/liam PS:MVC出来很久了,工作上一直没机会用.出于兴趣,工作之余我将展开对MVC的深入学习,通过博文来记录所学所得,并希望能得到各 ...
- 新开了一个ABP交流的QQ群(579765441 ),欢迎加入
因为ABP架构设计交流群人数一直爆满,很多想交流ABP的朋友无法加进群里, 刚新建了一个QQ群,群号579765441 (ABP架构设计交流群2),欢迎对ABP感兴趣的朋友加入. 欢迎加QQ群: AB ...
- Java中迭代器
任何容器类,都必须有某种方法可以插入元素并将它们再次取回,毕竟,持有事物是容器最基本的工作,对于List,add()是出入元素的方法之一,而get()是取出元素的方法之一. 如果从更高层的角度思考,会 ...