java类的访问权限
1.解析
Java有四种访问权限, 其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符。
- private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。
- default:即不加任何访问修饰符,通常称为“默认访问模式“。该模式下,只允许在同一个包中进行访问。
- protect: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。
- public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。
|
同一个类 |
同一个包 |
不同包的子类 |
不同包的非子类 |
|
|
Private |
√ |
|||
|
Default |
√ |
√ |
||
|
Protected |
√ |
√ |
√ |
|
|
Public |
√ |
√ |
√ |
√ |
场景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类成员访问权限总结(private,default,protected,public)
- Java基础详解 (一)Java的类成员访问权限修饰词(以及类访问权限)
在一个类的内部,其成员(包括成员变量和成员函数)能否被其他类所访问,取决于该成员的修饰词.Java的类成员访问权限修饰词有四类:private,无(默认情况下),protected和public.其权 ...
- Java编程思想学习笔记——类的访问权限
类的访问权限 Java中,访问权限修饰词用于确定库中哪些类对于该库的使用者是可用的. public class Foo{ } 注意点: 每个文件(编译单元)只能有一个public类. public类的 ...
- Java成员的访问权限控制
Java中的访问权限控制包含两个部分: 类的访问权限控制 类成员的访问权限控制 对类来说,访问权限控制修饰符可以是public或者无修饰符(默认的包访问权限): 对于类成员来说,访问权限控制修饰符可以 ...
- 浅析Java中的访问权限控制
浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但 ...
- java基础(八)-----深入解析java四种访问权限
Java中的访问权限理解起来不难,但完全掌握却不容易,特别是4种访问权限并不是任何时候都可以使用.下面整理一下,在什么情况下,有哪些访问权限可以允许选择. 一.访问权限简介 访问权限控制: 指的是本类 ...
- Chapter6_访问权限控制_类的访问权限
在Java中,访问权限修饰词也可以用于确定库中的哪些类对于该库的使用者是可用的,类既不可以是private也不可以是protected的,对于类的访问权限,只有两种选择:包访问权限或者public.下 ...
- java基础(七) java四种访问权限
引言 Java中的访问权限理解起来不难,但完全掌握却不容易,特别是4种访问权限并不是任何时候都可以使用.下面整理一下,在什么情况下,有哪些访问权限可以允许选择. 一.访问权限简介 访问权限控制: ...
- 【Thinking in Java, 4e】访问权限控制
[包:库单元] 编译单元的概念. 一个.java文件就是一个编译单元,一个编译单元只能有一个public类,编译单元中的非public类一般是用于为public类提供支持的,这些类在包外不可见. im ...
随机推荐
- 用css实现云状提示框
经常会用到云状提示框,如图: 基本框架是这样,以三角在左侧为例: <div class="container"> <div class="content ...
- zt:如何快速赚取人生第一个100万?
投递人 itwriter 发布于 2016-06-20 23:43 评论(16) 有1795人阅读 原文链接 [收藏] « » 不久前我开始使用「分答」,将回答问题的价格设置成 10 元.花最长 1 ...
- 真不知道JavaScrip【数组】还有这么多东西....
前段时间在频繁的用数组,但一直不知道JavaScript 数组还有这么多东西,收集了一下看看: 首先:数组是对象的特殊形式,接下来看看它有哪些方法.....push()在末尾增加一个或者是多个 uns ...
- net异步线程获取返回值的三种方式
方式一:endInvoke using System; using System.Collections.Generic; using System.Text; using System.Thread ...
- centos vmware centos6.6 64位 kvm虚拟化安装配置 第四十二节课
centos vmware centos6.6 64位 kvm虚拟化安装配置 第四十二节课 上半节课 下半节课 f
- div元素呈圆环排列
<style> .path { width: 300px; height: 300px; padding: 20px; border-radius: 50%; background: rg ...
- [转载]快速搭建Spring MVC 4开发环境
(一)工作环境准备: JDK 1.7 Eclipse Kepler Apache Tomcat 8.0 (二)在Eclipse中新建Maven工程,在Archetype类型中,选择“maven-arc ...
- Android --SwipeRefreshLayout 下拉刷新
1.Layout <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/id_swipe_ly" an ...
- Android --ListView模板
调整了近一上午的模板 ListView表头 <?xml version="1.0" encoding="utf-8"?> <LinearLay ...
- [ArcEngine]IFeatureBuffer使用
public static void LoadOnlyModeInsert(IFeatureClass featureClass, List < IGeometry > geometryL ...