浅析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类是可见的。
程序运行结果:

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

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

由此可以看出,如果用默认访问权限来修饰类的方法或者变量,则只能在同一个包的其他类中进行访问。
例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中报错:

如果在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类,则源代码文件的名称可以随意命名。
浅析Java中的访问权限控制的更多相关文章
- (转)浅析Java中的访问权限控制
原文地址: http://www.cnblogs.com/dolphin0520/p/3734915.html 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下 ...
- Java中的访问权限控制
Java提供了public, private, protected 三个访问权限修饰词,提供了以下四种访问权限控制机制: 1.包访问权限: 2.Public访问权限: 3.Private访问权限: 4 ...
- Java成员的访问权限控制
Java中的访问权限控制包含两个部分: 类的访问权限控制 类成员的访问权限控制 对类来说,访问权限控制修饰符可以是public或者无修饰符(默认的包访问权限): 对于类成员来说,访问权限控制修饰符可以 ...
- Java基础之访问权限控制
Java基础之访问权限控制 四种访问权限 Java中类与成员的访问权限共有四种,其中三种有访问权限修饰词:public,protected,private. Public:权限最大,允许所有类访问,但 ...
- 【Thinking in Java, 4e】访问权限控制
[包:库单元] 编译单元的概念. 一个.java文件就是一个编译单元,一个编译单元只能有一个public类,编译单元中的非public类一般是用于为public类提供支持的,这些类在包外不可见. im ...
- Thinking In Java 4th Chap6 访问权限控制
引入一个包及其所包含的方法:import java.util.ArrayList;(引入java.util包,并引入了包中的ArrayList类) import java.util.*;(引入了jav ...
- Java中的访问权限
Java中有四种访问权限,从大到小依次是:public –> protected –> default(friendly) –> private. 简单说明下: public 作用域 ...
- Java中的访问权限细谈
一.成员访问控制权限 作用域 当前类 当前包 子孙类 其他包 public √ √ √ √ protected √ √ √ X private √ X X X default √ √ 当前包下继承可以 ...
- Java中的访问控制权限
简介 Java中为什么要设计访问权限控制机制呢?主要作用有两点: (1)为了使用户不要触碰那些他们不该触碰的部分,这些部分对于类内部的操作时必要的,但是它并不属于客户端程序员所需接口的一部分. (2) ...
随机推荐
- Community Value再理解
其实之前写“从香港机房引入google/bitbucket路由”的时候,对community value的了解还并不深入,对Juniper default BGP export/import poli ...
- Gulp.js 参考手册,自动化构建利器
Gulp 是最新的基于 Node 的自动化构建工具,希望能够取代 Grunt,成为最流行的 JavaScript 任务运行器.通过结合 NodeJS 的数据流的能力,只需几步就能搭建起自己的自动化项目 ...
- 发测试 HTML/FILE/MYSQL/动态 20151120
NilCMS几种页面输出方式: 1.直接生成html.不进行php处理. 2.生成文件缓存.针对于URL中单个目录文件过多,不利于管理.只进行PHP处理,不连接mysql. 3.生成mysql缓存.数 ...
- Sass学习之路(5)——变量
1.定义变量:Sass中定义变量的关键字是'$'(毕竟程序员缺钱),并使用冒号(:)进行赋值,例如: $width:200px;//定义了一个名为width的变量,值为200px 2.普通变量和默认变 ...
- Egret白鹭H5小游戏开发入门(一)
前言: 好久没更新博客了,以前很多都不会,所以常常写博客总结,倒是现在有点点经验了就懒了.在过去的几个月里,在canvas游戏框架方面,撸过了CreateJS,玩得了Egret,又学过PIXI.js. ...
- AndroidAnnotations配置--Android studio
1.引入对android-apt的依赖.在全局build.gradle中文件中添加以下代码.(Project目录下的build.gradle) repositories { mavenCentral( ...
- Android NDK编译本地文件以及引用第三方so文件
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_LDLIBS :=-llog LOCAL_MODULE := DeviceAPI LO ...
- mac系统如何显示和隐藏文件
显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles YES隐藏Mac隐藏文件的命令:defaults write com.ap ...
- 直接双击启动tomcat中的startup.bat闪退原因及解决方法
免安装的tomcat双击startup.bat后,启动窗口一闪而过,而且tomcat服务未启动. 原因是:在启动tomcat是,需要读取环境变量和配置信息,缺少了这些信息,就不能登记环境变量,导致了t ...
- java环境变量 windows centos 安装jdk
windows: 1.安装jdk,注意不是jre 2. 计算机→属性→高级系统设置→高级→环境变量,选择下面的那个系统环境变量 3. 系统变量→新建 JAVA_HOME 变量 . 变量值填写jdk的安 ...