[javase学习笔记]-6.7 封装
这一节我们学习面向对象中的第一个特性,封装(encapsulation)
封装:是指隐藏对象的发生和实现细节,仅对外提供公共訪问方式.
那么什么是隐藏对象的实现细节?
我们来举例学习.
比方我们来定义一个人的类,简单点说,人的属性有年龄,行为有说话.
我们看以下的代码:
class Person//定义一个人的类
{
int age;
void speak()
{
System.out.println("age = "+age);
}
}
class PersonDemo//定义測试类
{
public static void main(String[] args)
{
Person p = new Person();
p.age = -20;//这时代码仍然正常执行了,这就造成了安全隐患
p.speak();
}
}
结果:
我们看到存在安全隐患,当我们为人的年龄属性赋值为负数时,程序是正常执行的.
那么如今把Person类改动一下
<pre name="code" class="java">class Person
{
private int age;
void speak()
{
System.out.println("age = "+age);
}
}
结果:
我们看到报错了,由于我们对age进行了私有,在PersonDemo类中无法訪问.
为了进一步解决这个问题,我们再对两个类进行改动:
class Person
{
private int age;//把该成员属性设置为私有
public void setAge(int a)
{
if(a>0 && a<130)
{
age = a;
speak();
}
else
System.out.println("错误的数据");
}
void speak()
{
System.out.println("age = "+age);
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p = new Person();
p.setAge(-20);//调用方法设置年龄,可是我们不知道该方法的内部实现
}
}
结果:
我们看到当age>0 && age<130时,才合法.
从这个过程我们看到,当我们要操作Person中的age属性时,是通过setAge方法来实现的,可是setAge方法是怎么实现的,外部类是无法知道的,这就是我们所要说的隐藏对象的属性和实现细节,也就是封装.
事实上对于属性的封装,为了外部訪问,我们一般有规范的get和set方法,我们来看一下两个规范且经常使用的方法:
class Person
{
private int age;//把该成员属性设置为私有 public void setAge(int a)//设置年龄
{
age = a;
}
public int getAge()//获取年龄
{
return age;
}
}
以下我们再来说说封装的长处和原则:
长处:
1.提高代码安全性;
2.实现对内部属性的可控性;
3.提高代码的复用性;
4.隔离变化;
原则:
1.将不须要对外提供的内容都隐藏起来;
2.把属性都隐藏起来,提供公共方法供外部訪问(当然不是全部方法都必须是公共方法).
最后我们再看一下刚才我们用到的一个keyword:private.
privatekeyword:指私有,是一个权限修饰符,用于修饰成员.私有的内容仅仅在本类中有效.
它的常见使用方法:就是将成员变量私有化,对外提供相应的set,get方法对其进行訪问.提高对数据訪问的安全性.
注意:私有不过封装的一种体现而已.
对于java语言来讲,最小的封装体就是函数.类也是封装体.框架本身也是封装体.这些都一个共性,就是我们能够不知道实现细节,直接拿来用就能够了.
[javase学习笔记]-6.7 封装的更多相关文章
- javaSE学习笔记(17)---锁
javaSE学习笔记(17)---锁 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率.本文旨在对锁相关源码(本文中的源码来自JDK 8).使用场景进行举例,为读 ...
- javaSE学习笔记(16)---网络编程
javaSE学习笔记(16)---网络编程 基本概念 如今,计算机已经成为人们学习.工作.生活必不可少的工具.我们利用计算机可以和亲朋好友网上聊天,也可以玩网游.发邮件等等,这些功能实现都离不开计算机 ...
- javaSE学习笔记(11)--- Map
javaSE学习笔记(11)--- Map 1.Map集合 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射.Jav ...
- javaSE学习笔记(10)---List、Set
javaSE学习笔记(10)---List.Set 1.数据存储的数据结构 常见的数据结构 数据存储的常用结构有:栈.队列.数组.链表和红黑树. 1.栈 栈:stack,又称堆栈,它是运算受限的线性表 ...
- JavaSE学习笔记(8)---常用类
JavaSE学习笔记(8)---常用类 1.Object类 java.lang.Object类是Java语言中的根类,即所有类的父类.它中描述的所有方法子类都可以使用.在对象实例化的时候,最终找的父类 ...
- JavaSE学习笔记(3)---面向对象三大特性
JavaSE学习笔记(3)---面向对象三大特性 面向对象的三大特征:继承.封装.多态 1.封装 面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改.然 ...
- JavaSE学习笔记(2)---面向对象基础
JavaSE学习笔记(2)---面向对象基础 1.面向对象具有三大特征:封装性.继承性和多态性,而面向过程没有继承性和多态性,并且面向过程的封装只是封装功能,而面向对象可以封装数据和功能.所以面向对象 ...
- javaSE学习笔记(15) ---缓冲流、转换流、序列化流
javaSE学习笔记(15) ---缓冲流.转换流.序列化流 缓冲流 昨天复习了基本的一些流,作为IO流的入门,今天我们要见识一些更强大的流.比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化 ...
- JavaSE学习笔记(14)---File类和IO流(字节流和字符流)
JavaSE学习笔记(14)---File类和IO流(字节流和字符流) File类 概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 构造方 ...
随机推荐
- MQTT学习
http://blog.csdn.net/mzwhhwj/article/details/77489890
- 洛谷——T P2136 拉近距离
https://www.luogu.org/problem/show?pid=2136 题目背景 我是源点,你是终点.我们之间有负权环. ——小明 题目描述 在小明和小红的生活中,有N个关键的节点.有 ...
- codeforces Looksery Cup 2015 H Degenerate Matrix 二分 注意浮点数陷阱
#include <cstdio> #include <cstring> #include <algorithm> #include <string> ...
- 小贝_mysql三种子查询
mysql三种子查询 简要: 一.三种子查询 二.三种子查询理解模型 一.mysql 三种子查询 where子查询.from子查询.exists子查询 二.理解模型: 2.1.一个好的模型,便于我们去 ...
- dpdk l2fwd 应用流程分析
int MAIN(int argc, char **argv) { struct lcore_queue_conf *qconf; struct rte_eth_dev_info dev_info; ...
- swift -函数、函数指针
// // main.swift // FunctionTest-04 // import Foundation println("函数測试!") testFunction() / ...
- vue 路由demo
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- nyoj--233--Sort it (水题)
Sort it 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 You want to processe a sequence of n distinct integer ...
- [NOIP2017] 逛公园 解题报告(DP)
我很不想说 在我的AC代码上我打了表,但实在没有办法了.莫名的8,9个点RE.然而即便是打表...也花了我很久. 这大概是NOIP2017最难的题了,为了让不懂的人更容易理解,这篇题解会比较详细 我的 ...
- POJ 1948 DP
题意:给你n个木棍(n<=40)每个木棍长度<=40,问用上所有的木棍拼成的三角形的面积的最大值,并输出面积*100的值(不四舍五入) 如果没有解,输出-1. 思路: 背包判断可达性. f ...