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. Linux下搭建web服务

    第一:安装java 第二:安装tomcat 第三:部署程序 第一:安装java 下载地址: http://www.oracle.com/technetwork/java/javase/download ...

  2. Spring通过IOC帮我们做火鸡

    一.IOC--setter注入 1.准备dmo 首先准备一只火鸡 public class Turkey { private int id; private String name; public i ...

  3. redis数据类型--hash

    /** Redis应用之Hash数据类型* 问题1:操作命令* 问题2:存储实现原理和数据结构* 问题3:应用场景* */ 先了解下什么是hash,什么是hash碰撞:hash:是包含键值对的kv的数 ...

  4. Xcode10.0: NO BUNDLE URL PRESENT

    目录 解决方案 1.删除build, 重新运行, 没有work 2.删除node_modules, npm i, 重新运行, 没有work 3.删除端口占用 4.代理设置, 可能work了 解决方案 ...

  5. mininet(三)简单的NAT实验

    mininet(一)实验环境搭建 mininet(二)简单的路由实验 mininet(三)简单的NAT实验 本次实验拓扑图如下: 假设 Openvswitch switch1是一个带有NAT功能的路由 ...

  6. 使用 nginx 实现虚拟主机

    当多个系统需要部署的时候,有系统访问很小,为了节省成本,就需要将多个系统部署到同一台服务器上,怎么在同一台服务器上,完成不同系统的部署和访问,就需要使用虚拟主机实现. 使用端口实现虚拟主机 配置 ng ...

  7. tensorflow tf.train.Supervisor作用

    tf.train.Supervisor可以简化编程,避免显示地实现restore操作.通过一个例子看. import tensorflow as tf import numpy as np impor ...

  8. CMFCPropertyGridCtrl的属性改变事件代码

    //用于区分Prop, 使用SetData, GetData方法 CMFCPropertyGridProperty* pProp1 = new CMFCPropertyGridProperty(str ...

  9. Linq 常用操作(增删改)

    增加 using(var db = new Entities()) { //数据操作 UserInfo user = new UserInfo() { UserName = "zhangsa ...

  10. TOMCAT_server.xml

    该文件描述了如何启动Tomcat Server <Server>    <Listener />    <GlobaNamingResources>    < ...