我们知道,封装将数据和处理数据的代码连接起来。同时,封装也提供另一个重要属性:访问控制。通过封装你可以控制程序的哪一部分可以访问类的成员。

通过控制访问,可以阻止对象的滥用。例如,通过只允许适当定义的一套方法来访问数据,你能阻止该数据的误用。因此,如果使用得当,可以把类创建一个“黑盒子”,虽然可以使用该类,但是它的内部机制是不公开的,不能修改。但是,本书前面创建的类可能不会完全适合这个目标。

例如,方法push( )和pop()确实为堆栈提供一个可控制的接口,这是事实,但这个接口并没被强制执行。也就是说,程序的其他部分可以绕过这些方法而直接存取堆栈,这是可能的。当然,如果使用不当,这可能导致麻烦。本节将介绍能精确控制一个类各种各样成员的访问的机制。

一个成员如何被访问取决于修改它的声明的访问指示符。Java提供一套丰富的访问指示符。存取控制的某些方面主要和继承或包联系在一起(包,package,本质上是一组类)。Java的这些访问控制机制将在以后讨论。现在,让我们从访问控制一个简单的类开始。一旦你理解了访问控制的基本原理,其他部分就比较容易了。

Java的访问指示符有public(公共的,全局的)、private(私有的,局部的)、和protected(受保护的)。Java也定义了一个默认访问级别。指示符protected仅用于继承情况中。

下面我们描述其他两个访问指示符。

让我们从定义public和private开始。当一个类成员被public指示符修饰时,该成员可以被你的程序中的任何其他代码访问。当一个类成员被指定为private时,该成员只能被它的类中的其他成员访问。现在你能理解为什么main( )总是被public指示符修饰。

它被在程序外面的代码调用,也就是由Java运行系统调用。如果不使用访问指示符,该类成员的默认访问设置为在它自己的包内为public,但是在它的包以外不能被存取(包将在以后的章节中讨论)。

到目前为止,我们开发的类的所有成员都使用了默认访问模式,它实质上是public。然而,这并不是你想要的典型的方式。通常,你想要对类数据成员的访问加以限制,只允许通过方法来访问它。另外,有时你想把一个方法定义为类的一个私有的方法。

访问指示符位于成员类型的其他说明的前面。也就是说,成员声明语句必须以访问指示符开头。下面是一个例子:

public int i;
private double j;
private int myMethod(int a,char b) { // ...
要理解public和private对访问的作用,看下面的程序:
/* This program demonstrates the difference between public and private.
*/ class Test { int a; // default access public int b; // public access private int c; // private access // methods to access c void setc(int i) { // set c's value c = i; } int getc() { // get c's value return c; }
}
class AccessTest { public static void main(String args[]) { Test ob = new Test();
// These are OK,a and b may be accessed directly ob.a = 10; ob.b = 20;
// This is not OK and will cause an error
// ob.c = 100; // Error!
// You must access c through its methods ob.setc(100); // OK System.out.println("a,b,and c: " + ob.a + " " + ob.b + " " + ob.getc()); }
}

可以看出,在Test类中,a使用默认访问指示符,在本例中与public相同。b被显式地指定为public。成员c被指定为private,因此它不能被它的类之外的代码访问。所以,在AccessTest类中不能直接使用c。对它的访问只能通过它的public方法:setc()和getc()。
如果你将下面语句开头的注释符号去掉,

// ob.c = 100; // Error!

则由于违规,你不能编译这个程序。

// This class defines an integer stack that can hold 10 values.
class Stack { /* Now,both stck and tos are private. This means
that they cannot be accidentally or maliciously
altered in a way that would be harmful to the stack. */ private int stck[] = new int[10]; private int tos; // Initialize top-of-stack Stack() { tos = -1; } // Push an item onto the stack void push(int item) { if(tos==9) System.out.println("Stack is full."); else stck[++tos] = item; } // Pop an item from the stack int pop() { if(tos < 0) { System.out.println("Stack underflow."); return 0;
} else return stck[tos--]; }
}

在本例中,现在存储堆栈的stck和指向堆栈顶部的下标tos,都被指定为private。这意味着除了通过push()或pop(),它们不能够被访问或改变。例如,将tos指定为private,阻止你程序的其他部分无意中将它的值设置为超过stck 数组下标界的值。

下面的程序表明了改进的Stack类。试着删去注释前面的线条来证明stck和tos成员确实是不能访问的。

class TestStack { public static void main(String args[]) { Stack mystack1 = new Stack(); Stack mystack2 = new Stack();
// push some numbers onto the stack for(int i=0; i<10; i++) mystack1.push(i); for(int i=10; i<20; i++) mystack2.push(i);
// pop those numbers off the stack System.out.println("Stack in mystack1:"); for(int i=0; i<10; i++) System.out.println(mystack1.pop()); System.out.println("Stack in mystack2:"); for(int i=0; i<10; i++) System.out.println(mystack2.pop());
// these statements are not legal
// mystack1.tos = -2;
// mystack2.stck[3] = 100; }
}

尽管由类定义的方法通常提供对数据的访问,但情况并不总是这样。当需要时允许一个实例变量为public是完全合适的。

例如,为简单起见,本书中大多数的简单类在创建时不关心实例变量的存取。然而,在大多数实际应用的类中,你将有必要仅仅允许通过方法来对数据操作。

Java基础:介绍访问控制相关推荐

  1. java基础之访问控制_繁星漫天_新浪博客

    在java中,针对类.成员方法和属性提供了四种访问级别,如图: private(类访问级别):如果类的成员被private访问控制符来修饰,则这个成员只能被该类的其他成员来访问,其他类无法直接访问 d ...

  2. java基础之类、对象、实例、属性、方法等概念理解

    在之前的文章里,讲过一些java基础概念,并写了一个简单的java入门代码,通过这些代码,对类和方法的定义做了部分说明. java基础介绍及第一个java程序 如果是了解java的同学,可能就没什么问 ...

  3. Android开发教程JAVA基础(汇总)

    Android游戏开发视频教程(汇总) Android开发教程JAVA基础之Java 概述 Android开发教程JAVA基础之标示符.关键字1 Android开发教程JAVA基础之标示符.关键字2 ...

  4. Java基础编程——基础语法及介绍

    Java基础编程--基础语法及介绍 介绍 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James Gosling和同事们共 ...

  5. Java基础-Date类常用方法介绍

    Java基础-Date类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.毫秒值概念 我们在查阅Date类的API文档时,会发现这样的一句话:"The cl ...

  6. Java基础-JAVA中常见的数据结构介绍

    Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...

  7. [Java基础] Properties类的基本操作和介绍

    引言 Java中的.properties文件是一种配置文件,主要用于表达配置信息:通俗来说,存放的数据就像是Map中的key和value的对应关系一样:这样就可以通过键值对来对属性进行匹配,并且属性列 ...

  8. java基础-Eclipse开发工具介绍

    java基础-Eclipse开发工具介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 所谓工欲善其事必先利其器,即将身为一名Java开发工程师怎么能没有一款好使的IDE呢?今天就 ...

  9. Java基础笔记 – 枚举类型的使用介绍和静态导入

    Java基础笔记 – 枚举类型的使用介绍和静态导入 本文由 arthinking 发表于404 天前 ⁄ Java基础 ⁄ 暂无评论 ⁄ 被围观 1,433 views+ 1.枚举(Enum): JD ...

最新文章

  1. 为什么程序return -1或exit(-1)而获取到的值是255
  2. 最优化算法python实现篇(3)——无约束一维极值(黄金分割法)
  3. effective typescript_初学typescript(一) - 来亦何哀
  4. anaconda怎么使用python包_Anaconda中python包的介绍与使用方法
  5. boost::fusion::join用法的测试程序
  6. Resource interpreted as Script but transferred with MIME type text/plain:
  7. rpm安装的mysql如何数据迁移_linux下mysql数据库的rpm安装步骤及常见问题的解决
  8. oracle rman 20207,RMAN-20207: UNTIL TIME or RECOVERY WINDOW is before RESETLOGS time
  9. [20171115]关于逻辑读的疑问.txt
  10. pytorch ImageFolder
  11. 吉林省学计算机哪所三本好,吉林省2016年三本大学排名
  12. 构建面向异构算力的边缘计算云平台
  13. 场景实践:使用函数计算打包下载OSS文件
  14. null值判断的一个避免错误
  15. 最新ncRNA数据库大全(含TCGA、ceRNA、exosome等)
  16. 神经网络学习小记录52——Pytorch搭建孪生神经网络(Siamese network)比较图片相似性
  17. 如何为HTML5 Video载入WebVTT字幕
  18. 研究:非英语背景移民更易识别澳大利亚俚语
  19. centos6如何添加阿里云centos和epel源
  20. 计算机心理活动,计算机科学系关于心理活动的总结

热门文章

  1. [转载] python学习-基础教程、深度学习
  2. 裴蜀(贝祖)定理及其证明
  3. 【java】之常用四大线程池用法以及ThreadPoolExecutor详解
  4. ORACLE分页查询SQL语法——高效的分页
  5. 洛谷 P1004 方格取数 WD
  6. ISP图像调试工程师——3D和2D降噪(熟悉图像预处理和后处理技术)
  7. 深入HashCode方法
  8. 混合高斯模型_大数据小白入门高斯混合模型(GMM)聚类算法
  9. python 随机数_python项目实战:实现蒙特卡罗方法,求物体阴影面积
  10. torch summary_留学论文如何5分钟搞定写作Summary,速看!