Java之封装与访问权限控制(一)

对于封装的概念,我总觉得自己还是挺了解的,但是真要我说,还真说不出个啥来。我只能默默地通过身边的例子加上书本理论完善我对封装的认识。

就比如,我们在玩游戏的时候,我们只能通过完成指定任务获得金币,并不能直接修改金币的值,作为玩家的我们,如果轻易就能修改机密,那岂不是乱套啦。设计者明显不想让我们这么做,他们允许我们享受游戏,但是这些禁忌碰不得。这就是封装的一个例子。

封装的概念

封装是面向对象三大特征之一。

将对象的状态信息隐藏再对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法对内部信息进行操作和访问。

优点

  • 隐藏类的实现细节。
  • 使用者只能通过预定的方法访问数据,可以控制方法逻辑,限制不合理访问。
  • 可进行数据检查,利于保证对象信息的完整性。
  • 便于修改,提高代码的可维护性。

需要考虑

  • 将对象的成员变量和实现细节隐藏起来,不允许外部直接访问。
  • 把方法暴露出来,让方法来控制对这些成员变量进行安全的访问操作。

将该隐藏的隐藏起来,将该暴露的暴露出来。

访问控制符

控制级别

public > protected >缺省> private

访问控制级别表

private default protected public
同一个类中
同一个包中
子类中
全局范围内

private(当前类访问权限):被修饰的成员只能在该类的内部被访问。

缺省(包访问权限) :缺省就是没有任何修饰符所修饰,缺省的成员可以被同一个包中的其他类所访问,关于包的概念,之后再提。

protected(子类访问权限) :被修饰的成员既可以被同一个包中的其他类访问,也可以被不同包中的子类所访问。关于子类和父类之后将会总结~

public(公共访问权限) :被修饰的成员可以被其他所有类访问,不论是否在同一包,不论是否具有继承关系。

注意

  • 外部类只能由public或缺省两种修饰方式,其他两个修饰没啥太大意义。

  • Java源文件的命名问题:

    • 定义的所有类中没有用public修饰,文件名随意取,合法就行,但不建议这样。
    • 如果定义了public修饰的类,文件名必须与public修饰的类类名相同,所以一个java源文件中只能有一个public修饰的类。
  • private用来修饰成员变量非常合适,可以很好实现隐藏和封装的目的。

  • 通常来说,用protected修饰一个方法,是希望子类来重写这个方法。

属性私有化

先来看看我们原先写过的简单的类及测试:

package com.my.pac08;

public class People {
public static void main(String[] args) {
Man man = new Man();
man.age = -4;
man.name = "12345";
man.run();
}
} class Man {
int age;
String name; void run() {
System.out.println("running..");
}
}
  • 一切都是那么普通,可以不加修饰符的地方都没有加。
  • 我们还是普通地创建了对象,普通地通过对象访问其属性。
  • 但是这样子会产生一个很明显的问题:要是和上面一样,赋上很离谱的值,就会产生同样离谱的结果
  • 于是我们采用了以下的解决办法。
package com.my.pac07;

public class Person {
//private 修饰符对成员变量 进行隐藏
private String name;
private int age; public String getName() {
return name;
} public void setName(String name) {
if (name.length() > 5) {
System.out.println(name+"的长度太长,取名失败!");
return;
}
System.out.println("取名成功!");
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
if (age < 0) {
System.out.println("输入年龄不合法!");
return;
}
this.age = age;
}
}
  • 将name和age两个实例变量用private修饰。
  • 加上与之匹配的一组方法,setter与getter方法用来设置与获取属性。
  • 在设置方法处,加入了逻辑判断,限制非法或无效赋值。
package com.my.pac07;

public class PersonTest {
public static void main(String[] args) {
Person p = new Person(); /*private修饰属性,不在同一个类中无法直接访问,需要
使用对应的getter和setter方法。
错误 p.name = 5;
错误 p.age = 10;
*/ //名字长度超过限制,通过加入逻辑控制输入
p.setName("Longname"); System.out.println(p.getName());
//赋符合标准的名字
p.setName("Dady"); System.out.println("p的名字是:"+p.getName());
//年龄超出限制,不能小于0
p.setAge(-4); System.out.println(p.getAge());
//赋正常年龄值
p.setAge(10); System.out.println("p的年龄是:"+p.getAge());
}
}
  • 无法再用对象.属性的方式直接访问。
  • 需要通过setter方法设置合理值,用getter方法获取值。
  • 两个方法的形式:set+首字母大写的属性,例如setName。getter方法同理。

以上简单的例子,就是私有化属性,隐藏需要隐藏的,并提供可以访问属性的方法,展示需要展示的,这就是封装性的体现之一。

链接下篇:Java之封装与访问权限控制(二)

Java之封装与访问权限控制(一)的更多相关文章

  1. Java之封装与访问权限控制(二)

    目录 Java之封装与访问权限控制(二) 包:库单元 import import static Java常用包 Java之封装与访问权限控制(二) 访问权限控制是具体实现的隐藏,是封装性的一部分体现. ...

  2. Java编程思想之六访问权限控制

    访问控制(或隐藏具体实现)与"最初的实现并不恰当"有关. 访问权限控制的等级,从最大权限到最小权限依次为:public,protected,包访问权限(没有关键字)和private ...

  3. java基础-类成员访问权限控制

    一 前言 这篇文章是很基础的一文,没多大深度,对于开发人员必然是熟练于心.本篇文章的主题是为什么java要设置类成员访问级别?其原因也很简单,就是为了面向对象的封装特性:将类成员使用不同的访问级别控制 ...

  4. 初读"Thinking in Java"读书笔记之第六章 --- 访问权限控制

    包:库单元 包内包含有一组类,他们在单一的名字空间下被组织在一起. 通过import ***.***.*可以将某个包下的所有类导入到当前文件中. 每个Java源文件最多只能有一个public类,且名称 ...

  5. (转)浅析Java中的访问权限控制

    原文地址: http://www.cnblogs.com/dolphin0520/p/3734915.html 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下 ...

  6. 浅析Java中的访问权限控制

    浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但 ...

  7. JAVA笔记 -- 访问权限控制

    访问权限控制 没有权限控制的时候,由于所有的接口都是可以访问的.当一个类库部分代码,发现有更好的方法解决的时候,可能其他接口会发生改动.这会导致另一个地方的引用该类库的程序发生崩溃.为了解决这种问题, ...

  8. Java访问权限控制

    访问权限控制           java提供了访问权限修饰词,以供类库开发人员向客户端程序员指明哪些是可用的,哪些是不可用的.访问权限控制的等级,从最大权限到最小权限依次是:public.prote ...

  9. Java之路(五) 访问权限控制

    在Java中,所有事物都具有某种形式的访问权限控制. 访问权限的控制等级从最大到最小依次为:public,protected,包访问权限(无关键词)和private. public,protected ...

随机推荐

  1. xmlhttp.readyState的值及解释

    xmlhttp.readyState的值及解释: 0:请求未初始化(还没有调用 open()). 1:请求已经建立,但是还没有发送(还没有调用 send()). 2:请求已发送,正在处理中(通常现在可 ...

  2. c语言l博客作业03

    问题 答案 这个作业属于哪个课程 c语言程序设计ll 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-3/homework/8727 我在这 ...

  3. PAT(甲级)2019年秋季考试

    第一题用搜索,超时了,待补 更新第一题思路 dfs + 剪枝,首先确定 n的最后一位数字肯定是9,为什么呢,因为 任意两个相邻的数肯定互为质数(gcd=1),所以 n 的末尾肯定是9,这样n+1产生的 ...

  4. Composer安装和使用

    Composer 是 PHP 的一个依赖管理工具.它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们.Composer 不是一个包管理器.是的,它涉及 "packages" ...

  5. Python 中如何实现参数化测试?

    Python 中如何实现参数化测试? 之前,我曾转过一个单元测试框架系列的文章,里面介绍了 unittest.nose/nose2 与 pytest 这三个最受人欢迎的 Python 测试框架. 本文 ...

  6. 链接脚本(Linker Script)用法解析(二) clear_table & copy_table

    可执行文件中的.bss段和.data段分别存放未赋初值的全局变量和已赋初值的全局变量,两者的特点分别为: (1).bss段:①无初值,所以不占ROM空间:②运行时存储于RAM:③默认初值为0 (2). ...

  7. 单片机内存分配中的.text .data .bss heap stack

    [本文转自:http://www.51hei.com/bbs/dpj-41696-1.html] .text段:代码段(code segment/text segment)通常是指用来存放程序执行代码 ...

  8. 灵魂拷问:Java 的 substring() 是如何工作的?

    在逛 programcreek 的时候,我发现了一些小而精悍的主题.比如说:Java 的 substring() 方法是如何工作的?像这类灵魂拷问的主题,非常值得深入地研究一下. 另外,我想要告诉大家 ...

  9. I_want_all 2019训练记录

    Team members StarHai binarycopycode Fly_White Caution 读题 数组第一维的访问速度比其他维速度快. 清空数组 乘法运算取模里面涉及到减法注意变为负数 ...

  10. POJ3261 Milks patterns(后缀数组)

    Farmer John has noticed that the quality of milk given by his cows varies from day to day. On furthe ...