成员变量的访问权限

我看到很多地方谈到关于Java里变量的访问权限问题.

很多地方认为对于默认修饰符的理解是这样的:

不写时默认为friendly

但就我所知Java里没有 friendly这一关键字.

当然学过C++的人都知道,在C++里有 friendly,而且其访问权限和Java里不写时默认情况一样.

我觉的可以这样理解,但不能这么认为.C++和Java毕竟是两种不同的语言,许多规则是不同的.

如果我说的有哪里不正确,请大家改正,谢谢.

访问权限修饰符声明了成员变量的访问权限。Java提供的显示的访问权限修饰符有3种,分别是:私有(private)、保护(protected)和公 共(public)。除此之外,还有一种默认的访问权限:friendly,它并不是Java的关键字,只有当变量前面没有写明任何访问权限修饰符时,就 默认以friendly作为访问权限。为了表达上的方便,省略了其中"成员"两字,将被这些修饰符所修饰的变量分别称为私有变量、保护变量和公共变量。下 面分别讨论各个修饰符的用法。

1.公共变量

凡是被public修饰的成员变量,都称为公共变量,它可以被任何类所访问。即允许该变量所属的类中所有方法访问,也允许其他类在外部访问。

公共变量使用示例。

public class declarePublic{

public int publicVar=10; //定义一个公共变量

}

在类declarePublic中声明了一个公共变量publicVar,它可以被任何类所访问。下面这段程序中,类otherClass可以合法地修改变量publicVar的值,而无论otherClass位于什么地方。

public class otherClass{

void change(){

declarePublic ca=new declarePublic(); //创建一个declarePublic对象

ca.publicVar=20; //通过对象名来访问它的公共变量,正确

}

}

用public修饰的变量,允许任何类在外部直接访问,这破坏了封装的原则,造成数据安全性能下降,所以除非有特别的需要,否则不要使用这种方案。

2.私有变量凡是被private修饰的成员变量,都称为私有变量。它只允许在本类的内部访问,任何外部类都不能访问它。

私有变量使用示例。

public class declarePrivate{

private int privateVar=10; //定义一个私有变量

void change(){

privateVar=20; //在本类中访问私有变量,合法

}

}

如果企图在类的外部访问私有变量,编译器将会报错。

public class otherClass{

void change(){

declarePrivate ca=new declarePrivate(); //创建一个declarePrivate对象

ca.privateVar=20; //企图访问私有变量,非法

}

}

为了让外部用户能够访问某些私有变量,通常类的设计者会提供一些方法给外部调用,这些方法被称为访问接口。下面是一个改写过的declarePrivate类。

public class declarePrivate{

private int privateVar=10; //定义一个私有变量

void change(){

privateVar=20;

}

public int getPrivateVar(){ //定义一个接口,返回私有变量privateVar的值

return privateVar;

}

public boolean setPrivateVar(int value){ //定义一个接口,可以设置privateVar

的值

//可以在这里先检测value是否在允许的范围内,然后再执行下面的语句。

privateVar = value;

return true;

}

}

私有变量很好地贯彻了封装原则,所有的私有变量都只能通过程序员设计的接口来访问,任何外部使用者都无法直接访问它,所以具有很高的安全性。但是,在下面这两种情况下,需要使用Java另外提供的两种访问类型:

通过接口访问私有变量,将降低程序的性能,在程序性能比较重要的情况下,需要在安全性和效率间取得一个平衡。

私有变量无法被子类继承,当子类必须继承成员变量时,需要使用其他的访问类型。

3.保护变量

凡是被protected修饰的变量,都被称为保护变量。除了允许在本类的内部访问之外,还允许它的子类以及同一个包中的其他类访问。子类是指从该类派生出来的类。包是Java中用于管理类的一种松散的集合。二者的详细情况将在第4章介绍。下面是一个简单的例子。

保护变量使用示例。

下面这个程序先定义一个名为onlyDemo的包,declarProtected类就属于这个包。

public class declareProtected{

protected int protectedVar=10; //定义一个保护变量

void change(){

protectedVar=20; //合法

}

}

说明:读者编译这个文件时,需要用这个命令(下同):

javac -d . 文件名

下面这个otherClass类也定义在onlyDemo包中,与declareProtected类同属于一个包。

public class otherClass{ //它也在包onlyDemo中

void change(){

declareProtected ca=new declareProtected();

ca.protectedVar=20; //合法

}

}

下面这个deriveClass类是declareProtected的子类,它并不在onlyDemo包中。它也可以访问保护变量protectedVar,但是只能通过继承的方式访问。

import onlyDemo.declareProtected; //引入需要的包

public class deriveClass extends declareProtected{ //定义一个子类

void change(){

//合法,改变的是deriveClass从declarProtected中所继承的protectedVar值

protectedVar=30;

}

}

说明:import是Java中的关键字,用于引入某个包。这将在4.13节中详细介绍。

子类如果不在父类的同一包中,是无法通过"对象名.变量名"的方式来访问protected类型的成员变量,比如下面这种访问是非法的:

import onlyDemo.declareProtected;

public class deriveClass extends declareProtected{ //定义一个子类

void change(){

declareProtected ca=new declareProtected();

ca.protectedVar=30; //错误,不允许访问不在同一包中的保护变量

}

}

4.默认访问变量

如果在变量前不加任何访问权修饰符,它就具有默认的访问控制特性,也称为friendly变量。它和保护变量非常像,它只允许在同一个包中的其他类访问, 即便是子类,如果和父类不在同一包中,也不能继承默认变量(这是默认访问变量和保护变量的唯一区别)。因为它限定了访问权限只能在包中,所以也有人称默认 访问权限为包访问权限。

默认访问变量使用示例。

package onlyDemo; //本类定义在包中

public class declareDefault{

int defaultVar=10; //定义一个默认访问变量

void change(){

defaultVar=20; //合法

}

}

onlyDemo包中的其他类,可以访问defaultVar变量:

package onlyDemo;

public class otherClass{ //它也在包onlyDemo中

void change(){

declareDefault ca=new declareDefault();

ca.defaultVar=20; //合法

}

}

下面是它的子类,也在onlyDemo包中。它除了可以像包中其他类那样通过"对象名.变量名"来访问默认变量,还可以通过继承的方式来访问。

package onlyDemo;

public class deriveClass extends declareDefault{ //定义一个子类

void change(){

//合法,改变的是deriveClass从declarDefault中所继承的defaultVar值

defaultVar=30;

}

}

如果子类不在onlyDemo包中,就不会继承默认变量,也就无法像上面那样来访问。

import onlyDemo.declareDefault;

public class deriveClass extends declareDefault{ //定义一个子类

void change(){

defaultVar=30; //非法,这个变量没有继承下来

}

}

java变量访问权限_JAVA成员变量的访问权限相关推荐

  1. java成员变量的初始化_Java成员变量初始化过程

    import java.util.*; public class Main { public static void main(String[] args){ Student s = new Stud ...

  2. java 访问类变量_如何访问类的成员变量和方法

    在Java应用程序中,经常需要访问类的成员变量和方法,以实现程序的功能,请问应该如何访问类的成员变量和方法?在Java中通过类的实例(即对象)点(.)运算符来访问类的成员变量和方法,今天百分网小编为大 ...

  3. java访问成员变量和方法_如何访问类的成员变量和方法

    如何访问类的成员变量和方法 在Java应用程序中,经常需要访问类的成员变量和方法,以实现程序的功能,请问应该如何访问类的成员变量和方法?在Java中通过类的实例(即对象)点(.)运算符来访问类的成员变 ...

  4. 为什么 Java 与 Python 在对待成员变量的访问控制方式截然相反?

    转自知乎:http://www.zhihu.com/question/20885435 为什么 Java 与 Python 在对待成员变量的访问控制方式截然相反? Java提倡成员变量应该是priva ...

  5. java变量存储位置_java 中变量存储位置的区别

    [原文] 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量 ...

  6. Java为枚举类创建成员变量_Java学习——枚举类

    Java学习--枚举类 摘要:本文主要介绍了Java的枚举类. 部分内容来自以下博客: https://www.cnblogs.com/sister/p/4700702.html https://bl ...

  7. 1.3 Java类的属性:成员变量的定义和声明

    在 Java 中类的成员变量定义了类的属性.例如,一个学生类中一般需要有姓名.性别和年龄等属性,这时就需要定义姓名.性别和年龄 3 个属性.声明成员变量的语法如下: [public|protected ...

  8. java类默认访问权限_Java的四种访问权限

    ❝ 所谓访问权限,指的就是本类中的成员变量.成员方法对其他类的可见性 ❞ 试想一想,当我们修改一个非常庞大的项目时,如果所有变量和方法都是公共权限,那么后端中任何类都有权限去修改它的变量和方法,很有可 ...

  9. Java学习笔记——局部变量和成员变量

    声明:本文首发于我的个人微信公众号[Java编程社区],查看更多文章与学习资源请移步我的公众号Java编程社区 成员变量:定义在类中的变量. 局部变量:定义在方法中的变量. 成员变量与局部变量的区别: ...

最新文章

  1. 图灵1月书讯:阅新书辞旧岁,览经典迎新年
  2. linux 系统运行状况 shell命令 watch 监控进程是否存在
  3. leetcode 215.数组中的第K个最大元素
  4. Winrar从命令行查看压缩文件内容
  5. python删除排序数组中的重复项
  6. 原生html小游戏,原生JS实现别踩白块小游戏(一)
  7. 九十六、双指针和滑动窗口算法模板
  8. HashTable 源码解读
  9. SQLAlchemy ORM教程之二:Query
  10. 【Java】百钱买百鸡问题
  11. 【Elasticsearch】极限网关 INFINI Gateway 初体验
  12. XHTML + CSS使用技巧
  13. 从入门到入土:Python爬虫学习|实例练手|爬取LOL全英雄信息及技能||异步加载|初级难度反扒处理|寻找消失的API
  14. 制造业实施大数据战略面临哪些挑战
  15. 求四科平均成绩c语言,c语言实验报告评语大全
  16. EF There is already an open DataReader associated with this Command
  17. 最新的windows xp sp3序列号 xp序列号
  18. 【学习笔记】【C++整理A】【总】单例模式-饿汉式、懒汉式;
  19. 5年软件渗透测试工程师的从业经验分享,值得借鉴
  20. Win10设置系统补丁更新服务器,win10系统手动更新补丁如何设置 win10系统手动安装更新方法...

热门文章

  1. centos7每天定时删除备份mysql文件
  2. Qt C++属性类型提供给 QML调用(一)
  3. 如何在一个.c文件里调用另一个.c文件里的变量
  4. 剑指offer之斐波那契问题(C++/Java双重实现)
  5. 细品java封装继承多态
  6. android image 位移动画_深入理解Android之动画
  7. mysql 5.7.22 winx64_windows下mysql-5.7.22-winx64突然启动不了,报错Could not open log file
  8. 文件系统_Docker文件系统实战
  9. python怎么写多行_python 多行字符串怎么写才能不破坏缩进
  10. 双向TVS二极管 8KP33CA参数详解