JavaSE基础之封装
JavaSE基础之封装
一、Java中的封装
1、字面意思:
包装;
2、专业含义:
面向对象的三大特征之一;
指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。
二、封装的目的
1、隐藏类的实现细节;
2、让使用者只能通过事先预定的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对成员变量的不合理访问;
3、可进行数据检查,从而有利于保证对象信息的完整性;
4、便于修改,提高代码的可维护性;
三、如何实现良好的封装
1、将对象的成员变量和实现细节隐藏起来,不允许外部直接访问;
2、把方法暴露出来,让方法来控制对这些成员变量进行安全的访问和操作。
四、封装的实现
1、Java提供3个访问控制符:
private、protected和public;
2、4个访问控制级别:(访问范围越来越大)
private->default->protected->public;
3、访问控制级别表
同一个类 | 同一个包 | 不同包 | 不同包的非子类 | |
public | 可以 | 可以 | 可以 | 可以 |
default | 可以 | 可以 | 可以 | |
protected | 可以 | 可以 | ||
private | 可以 |
五、代码实现
1、实现封装的实体类:Person.java
package cn.com.zfc.lesson04.object.encapsulation; /**
*
* @title Person
* @describe 实现封装:注意 age 的 setter()方法
* @author 张富昌
* @date 2017年4月9日下午4:24:38
*/
public class Person { // 属性私有化
private String name;
private String sex;
private int age; // 提供一个无参的构造器
public Person() {
} // 提供私有成员变量的访问方法
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} public int getAge() {
return age;
} // 在给年龄赋值的时候,得判断当前年龄是否合法
public void setAge(int age) throws RuntimeException {
if (age < 0) {
throw new RuntimeException("年龄不能小于 0 啊");
} else if (age > 200) {
throw new RuntimeException("你是老妖怪吗?都有200多岁了");
} else {
this.age = age;
}
} // 重写 toString()方法,便于测试
@Override
public String toString() {
return "Person [name=" + name + ", sex=" + sex + ", age=" + age + "]";
} }
2、测试封装:TestEncapsulation.java
package cn.com.zfc.lesson04.object.encapsulation; /**
*
* @title TestEncapsulation
* @describe 测试封装
* @author 张富昌
* @date 2017年4月9日下午4:25:40
*/
public class TestEncapsulation {
public static void main(String[] args) {
// 创建 Person 对象
Person person = new Person(); // 给 Person 对象的 name 属性赋值
person.setName("张富昌"); // 获取 Person 的 name 属性值
String name = person.getName();
System.out.println("Person's name:" + name); // 给 Person 对象的 age 成员变量赋值,这是可以检验数据的合法性
person.setAge(300);
}
}
测试结果:
JavaSE基础之封装的更多相关文章
- javaSE基础07
javaSE基础07 一.static静态修饰符 用了static修饰的变量就会变成共享的属性,只会初始化一次,在内存中只存在一个,并且每个对象都可以访问,存放在方法区(数据共享区) 1.1 stat ...
- javaSE基础05
javaSE基础05:面向对象 一.数组 数组的内存管理 : 一块连续的空间来存储元素. Int [ ] arr = new int[ ]; 创建一个int类型的数组,arr只是一个变量,只是数组的一 ...
- javase基础复习攻略《十》
按照计划本篇为大家总结JAVA的网络编程,什么叫网络编程呢?网络编程!=网站编程,对于这一点大家一定要注意,很多小朋友都曾经这么认为.既然谈到网络编程,咱们先了解一下网络的基础知识,什么是计算机网络? ...
- 基础1 JavaSe基础
JavaSe基础 1. 九种基本数据类型的大小,以及他们的封装类 boolean 无明确指定 Boolean char 16bits Character byte 8bits Byte short 1 ...
- JavaSE基础之JDBC
JavaSE基础之JDBC 1.JDBC 的步骤: ①加载数据库驱动: a.MySQL:com.mysql.jdbc.Driver: b.SQLServer:com.microsoft.jdbc.sq ...
- 巩固JavaSE基础--IDEA完成实战项目
PS:学习完JavaSE基础后,需要有一个项目来测试自己的学习成果,并加以巩固.所以在这里,就让我们来学习下“一本糊涂账”项目吧.(此项目来源于Java自学网站) 项目完成效果图一览
- javaSE基础06
javaSE基础06 一.匿名对象 没有名字的对象,叫做匿名对象. 1.2匿名对象的使用注意点: 1.我们一般不会用匿名对象给属性赋值的,无法获取属性值(现阶段只能设置和拿到一个属性值.只能调用一次方 ...
- javaSE基础04
javaSE基础04 一.三木运算符 <表达式1> ? <表达式2> : <表达式3> "?"运算符的含义是: 先求表达式1的值, 如果为真, ...
- javaSE基础03
javaSE基础03 生活中常见的进制:十进制(0-9).星期(七进制(0-6)).时间(十二进制(0-11)).二十四进制(0-23) 进制之间的转换: 十进制转为二进制: 将十进制除以2,直到商为 ...
随机推荐
- J - Clairewd’s message HDU - 4300(扩展kmp)
题目链接:https://cn.vjudge.net/contest/276379#problem/J 感觉讲的很好的一篇博客:https://subetter.com/articles/extend ...
- 键盘ASCII码
回车键 -- CR 键0x0d -- 16进制13 -- 10 进制'\r' -- 也可以 换行键 -- LF0x0a -- 16进制10 -- 10 进制'\n' -- 也可以 esc键 ...
- Linux下获取和设置IP
在Linux下获取关于IP和网关的操作:重点是对struct ifreq 的操作. 那么进入目录/usr/include/net/if.h下看查找struct ifreq结构体. /* Interfa ...
- 数据库-mysql数据类型
MySQL 数据类型 MySQL中定义数据字段的类型对你数据库的优化是非常重要的. MySQL支持多种类型,大致可以分为三类:数值.日期/时间和字符串(字符)类型. 数值类型 MySQL支持所有标准S ...
- vue项目下使用iview总结
iview在IE浏览器下有问题,打开页面是空白
- 简单计算器的C实现-函数指针,main函数传参
/** 程序功能:简单计算器,实现加减乘除平方* 作者版本日期:2015.11.08 zhouhb OK* 源代码:李明 <新概念C语言培训>第33集 C语言Shell命令解释器的实现* ...
- Java 泛型和类型安全的容器
使用java SE5之前的容器的一个主要问题就是编译器允许你向容器插入不正确的类型,例如: //: holding/ApplesAndOrangesWithoutGenerics.java // Si ...
- manacher模板
转自:http://blog.csdn.net/zzkksunboy/article/details/72600679 作用 线性时间解决最长回文子串问题. 思想 Manacher充分利用了回文的性质 ...
- 2017-2018-2 20165301 实验四《Java面向对象程序设计》实验报告
2017-2018-2 20165301 实验四<Java面向对象程序设计>实验报告 一.Android Stuidio的安装测试 实验要求: 参考<Java和Android开发学习 ...
- C#比较时分秒大小,终止分钟默认加十分钟,解决跨天、跨月、跨年的情况
private void cmbInHostimes_SelectedIndexChanged(object sender, EventArgs e) { DataRow[] dr; if (chkM ...