菜鸡的Java笔记 第十一 - java 封装性
1.1封装的基础实现。
封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。封装是一种信息隐藏技术,在java中通过关键字private实现封装。什么是封装?封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。
1.2封装的作用
① 对象的数据封装特性彻底消除了传统结构方法中数据与操作分离所带来的种种问题,提高了程序的可复用性和可维护性,降低了程序员保持数据与操作内容的负担。
②对象的数据封装特性还可以把对象的私有数据和公共数据分离开,保护了私有数据,减少了可能的模块间干扰,达到降低程序复杂性、提高可控性的目的。
/*封装性 说的是 安全性 不让外部对象直接调用或者是修改
需要解决的是 把属性保护起来 JAVA 关键字 private
但是 太安全了 外部无法访问
如想现在需要通过对象操作类中的属性在java 中有个要求 可以使用 setter,getter 设置或 取得属性
以public String name 封装为例
设置属性 public void setName(String n): 名称 要首字母大写
取得属性 public void getName():
*/
// 以后只要是类中的属性全部都要使用private 封装 封装后的是属性必须按照要求编写 setter,getter 方法
class Person { //现在定义一个类
//定义类中的两个属性
private String name; // 表示人的姓名
private int age; // 表示人的年龄
public void tell(){
System.out.println("姓名:" + name +"年龄:" + age);
}
public void setName(String n){
name = n;
}
public void getName(){
return name;
}
public void setAge(int a){
if(a >= 0&&a <= 100){
age = a;
}
}
public void getAge(){
return age;
}
}
public class T{// 另一个类
public static void main (String args[]){
Person per = new Person();
per.setName("少爷"+"\n");
per.setAge(-3);
per.tell();
}
}
/* private 声明的属性只能够被类的内部做访问
private 声明的属性必须有对应的 setter,getter 方法
*/
>>>
在JAVA中所有面向对象的概念都是以类与对象的关系为主的。那么下面通过一个具体的程序来研究一下,为什么需要有封装性。
范例:观察如下程序代码
class Person { //现在定义一个类
//定义类中的两个属性
String name: // 表示人的姓名
int age: // 表示人的年龄
public void tell(){
system.out.println("姓名:" + name +"年龄:" + age):
}
}
public class T{// 另一个类
public static void main (String args[]){
Person per = new Person():
per.neme = "少爷":
per.age = -30:
per.tell():
}
}
// 姓名:少爷,年龄:-30
现在的代码没有语法错误,但是从显示的角度来讲,这个代码是有错误的,而且问题严重。这样的错误严格来讲就属于业务错误。那么造成这种出错的原因是什么?
最大的错误在于当前类中的属性可以直接被类外部的对象调用。所以,此时就认为这样的操作属于不安全的操作
那么现在最需要解决的问题设计将内部的属性保护起来,即,不让外部直接操作。为此在JAVA中提供有一个 private 关键字,利用此关键字可以实现封装。
加入 private 之后,就表示此时 name 与 age 两个属性只能够被person类访问。
范例;错误调用
现在发现,使用了private 定义的属性,类的外部不能够直接进行访问了,所以安全性是最高的
那么如果现在需要通过对象操作类中的属性,那么JAVA 中就有了一个明确额要求:可以使用 setter,getter 方法设置或取得封装内容,以 privare String name 封装属性为例:
设置数据:public void setName(String n );
取得数据:public String getName();
以 private int age ;封装属性为例:
设置数据:public void setAge(int a);
取得数据:public int getAge();
范例:修改程序,使得外部可以访问私有属性
开发原则:以后只要是类中的属性全部使用 private 封装,封装后的属性必须严格按照要求编写 setter,getter 方法,不管当前代码是否调用了 getter,必须提供
如果非要进行一些检测操作,则可以修改 setter 方法(只是现在临时说明)
// 姓名:哪吒,年龄:0
/* private 声明的属性只能够被类的内部做访问
private 声明的属性必须有对应的 setter,getter 方法
*/
>>>>>
private 声明的属性只能够被类的内部所访问;
private 声明的属性必须有对应的 setter,getter 方法,而且方法名称要求按照严格标准编写
---------------------------------------------
封装的简单例子:
先来个例子看看;
public class Man{
//对属性的封装,一个人的姓名,年龄,妻子都是这个对象(人)的私有属性
private String name;
private int age;
private Woman wife;
//对该人对外界提供方法的封装,可以设定妻子,姓名,年龄也可以获得男人的姓名和年龄
// 方法封装
public void setWife(Woman wife){
this.wife = wife;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
}
public class Woman{
// 属性封装
private String name;
private int age;
private Man husband;
// 方法封装
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
public Man getHusband(){
return husband;
}
public void setHusband(Man husband){
this.husband = husband;
}
}
/**
仔细看就会发现,Man类没有提供getWife的方法,这是因为男人不想让自己的妻子被外界访问,接下来呢,就是封装可以把一个对象的属性私有,而提供一些可以被外界访问的属性的方法,比如说,name属性,Man和Woman类都有相应的get和set方法,外界都可以通过这些方法访问和修改。同时对一些对象不想让外界访问的属性,就不提供其方法,比如说Man的wife属性,就没有get方法。外界是不能得到Man类的wife属性的
*/
上面那例子可能没有突出封装的好处,下面来个超简单的表达下:
public class Show{
public static void show(String str){
System.out.println(str);
}
}
上面就是对 System.out.println();的封装。
调用的时候 :
public class Use{
public static void main(String[] args){
Show.show("封装");
}
}
这样用的时候就不用使:System.out.println("封装");
菜鸡的Java笔记 第十一 - java 封装性的更多相关文章
- 【Java笔记】配置文件java.util.Properties类的使用
配置文件的路径:项目名/src/main/resources/mmall.properties mmall.properties的内容是键值对.例如假设写了ftp服务器的一些信息. ftp.serve ...
- Java笔记12:Java对象排序
代码: import java.util.Arrays; import java.util.Comparator; class Person { private String name; privat ...
- [改善Java代码]使用静态内部类提高封装性
建议38: 使用静态内部类提高封装性 Java中的嵌套类(Nested Class)分为两种:静态内部类(也叫静态嵌套类,Static Nested Class)和内部类(Inner Class).内 ...
- 菜鸡的Java笔记 第二十一 final 关键字
使用final定义类,属性,方法 final在一些书中被称为终结器,意思是:利用final定义的类不能够有子类,利用final定义的方法不能够被覆写,利用final定义的变量就成 ...
- 菜鸡的Java笔记 第二十三 - java 抽象类的概念
abstractClass 抽象类的概念 1.抽象类的基本定义 2.抽象类的使用原则 不会抽象类与接口,java = 没学 ...
- 菜鸡的Java笔记 第八 - java 面向对象
面向对象的特点以及开发过程. java中最大的特点是其支持面向对象编程设计思想.在面向对象之前广泛流传的是面向过程的编程思想,例如:C语言的开发就属于面向过程 如果要想更简单的去理解面向过 ...
- 菜鸡的Java笔记 第七 - java 数组
数组的基本概念 笔试中经常出现的试题或是问题 1.1 概念 数组指的是一组相关变量的集合 如果用最原始的方式定义100个变量的话没问题但是这些变量的关联实在 ...
- 菜鸡的Java笔记 第六 - java 方法
前提:现在所讲解的方法定义格式,只属于JAVA 方法定义的其中一种组成方式.而完整的组成方式将随着学习逐步渗透. 1.方法的基本定义 方法(Method)在一些书中也会有人将其说是 函数(Funct ...
- 菜鸡的Java笔记 第五 - java 程序逻辑控制
程序主要分为三种逻辑:顺序,分支,循环. if 分支语句 if分支语句是最为基础的分支操作,但是其有三种使用形式: if语句 if.....else 语句 if....else...if...el ...
随机推荐
- 从零入门 Serverless | SAE 场景下,应用流量的负载均衡及路由策略配置实践
作者 | 落语 阿里云云原生技术团队 本文整理自<Serverless 技术公开课>,关注"Serverless"公众号,回复"入门",即可获取 S ...
- Data Management Tools(数据管理工具)《一》
数据管理工具 1.LAS数据集 # Process: LAS 数据集统计数据 arcpy.LasDatasetStatistics_management("", "SKI ...
- SpringBoot入门04-组件扫描ComponetScan
被扫描的包下面的类如果被下面注解,则被创建加入到IOC中去 @Component:没有明确的角色 @Service:业务层角色 @Repository:持久层角色 @Controller:控制层角色 ...
- 如何在印刷品中使用遵循SIL Open Font License协议的字体
如何在印刷品中使用遵循SIL Open Font License协议的字体 昨天在知乎看到了一个问题,( 如何在设计中声明字体开源许可证? - 知乎 (zhihu.com),恰好最近在研究一些开源协议 ...
- NX Open显示符号(UF_DISP_display_temporary_point)
UF_DISP_display_temporary_point 使用方法: 1 Dim x As Double = 0, y As Double = 0, z As Double = 0 2 3 Di ...
- scala基础篇 使用getter和setter方法而不使用public的情形
主要是基于2种情形 1) 提供读只取/只写入方法,不能随意读写 2)做赋值时变量控制,比如设定值的区间范围等 例子: object test{ def main(args: Array[String] ...
- 【数据结构与算法Python版学习笔记】递归(Recursion)——定义及应用:分形树、谢尔宾斯基三角、汉诺塔、迷宫
定义 递归是一种解决问题的方法,它把一个问题分解为越来越小的子问题,直到问题的规模小到可以被很简单直接解决. 通常为了达到分解问题的效果,递归过程中要引入一个调用自身的函数. 举例 数列求和 def ...
- Wireshark 过滤器的使用
符号 例子 = = tcp.port = = 80 过滤出来TCP包含80端口的数据包 != ip.src != 127.0.0.1 ip的原地址不是127.0.0.1过滤出来 > lp.len ...
- try-catch-finally面试题
try catch finally 执行顺序面试题总结 执行顺序 今天牛客网遇到这个题目,做对了,但是下面的评论却很值得看看 public class TestTry { public int add ...
- 需求存在,功能存在——Alpha阶段性总结
0.Alpha开发成果 题士Alpha发布报告 题士开发记录 1.任务划分 Alpha阶段大致将任务划分为Design,Develop和Test三类 Design型任务包含页面UI设计和接口API设计 ...