技术标签: 面向对象 java java学习 封装性 类 封装
封装(encapsulation)是面向对象的三要素之一(其它两个是继承和多态),它有两成含义:
1、将数据(属性)和函数(行为)放在一个独立的类中,使类成为一个独立的单元。
2、通过访问限定符(private等)实现对信息的隐藏或公开,隐藏类的内部实现。而留下一些接口(public的成员函数)与外界进行信息交换(外界要想访问某个成员只能通过接口实现)当类的设计者改变了类的内部实现时,但只要接口不变,对于类的使用者而言,没有任何影响。这就是所谓的“接口和实现的分离”
那么什么是封装? 简单地说,封装就是将数据和函数放在一起,将不想让外界看到的内容(通常是数据)声明为private的,不允许外界存取。外界要想访问的话,就只能通过类留给外部的接口。
为了更好的理解为什么要对对象进行封装,下面举个例子进行说明
先写两个类 :
package day01
public class Person{
public int age;
public void printAge()
{
System.out.println("年龄是:"+age);
}
}
package day01
public class Test{
public static void main(String[] args)
{
Person p = new Person();
p.age = -100;
p.printAge();
}
}
运行后打印结果为:年龄是:-100
分析一下代码:
程序是没问题的也能正常运行,但是年龄为-100显然不符合正常逻辑。从代码可以看出在new完一个person对象后用户可以对它的age属性随便赋值。像这种情况是把类的属性开放出来,让调用者随意使用,这样就会出现问题,它们很容易被一些粗心的或不知情的客户端程序员所毁坏。
所以我们需要对这样不能让调用者随意使用的属性做封装和隐藏以减少程序的bug。这意味着类的创建者可以任意修改被隐藏的部分,而不用担心对其他调用者造成影响。
代码修改后如下:
package day01
public class Person{
private int age;
public void setAge(int a)
{
if(a <=150 && a>=0){
this.age = a;
}else{
System.out.println("输入的年龄:"+a+"不在0到150之间");
}
}
public int getAge()
{
return this.age;}
public void showAge()
{
System.out.println("年龄是:"+this.getAge());
}
}
package day01
public class Test{
public static void main(String[] args)
{
Person p1 = new Person();
Person p2 = new Person();
p1.setAge(55);
p1.showAge();
p2.setAge(60);
p2.showAge();
}
}
可以看到修改过后的对象不能直接通过p.age进行赋值操作,因为此时的age属性已经是被private限制,只能由类内部的成员函数调用并进行传参。
封装的一个原则是:“信息的最小化公开”,所以在理想状态下,通常将所有的数据都声明为private(因为随便对类的内部数据进行更改是很危险的),如果想改变和得到某个数据的话,那么使用相应的接口进行访问
Person p1 = new Person();
Person p2 = new Person();
p1.setAge(55);//在这里this指向p1
p2.setAge(60);//在这里this指向p2
java中类的封装和隐藏就是:
通过将类的成员数据声明为私有的(private),再提供公共的(public)方法:getXXX()和setXXX()实现对该属性的操作。以实现以下目的。
欢迎持续关注!
个人博客站:jQueryZK Blog
Vue 全局事件总线
1using System;using System.Collections.Generic;using System.Text;namespace experment5_1{class Student //学生类{int sno; //学号string sname; //姓名Course[] cou...
一、上传单个文件 上传文件是很多Web程序都具有的功能。在Struts1.x中已经提供了用于上传文件的组件。而在Struts2中提供了一个更为容易操作的上传文件组 件。所不同的是,Struts1.x的上传组件需要一个ActionForm来传递文件,而Struts2的上传组件是一个拦截器(这个拦截器不用配置, 是自动装载的)。在本文中先介绍一下如何用struts2上传单个文件,最后介绍一下用...
Kafka进程被强制退出(kill -9)后重启,碰到如下问题:FATAL Fatal error during KafkaServerStable startup. Prepare to shutdown (kafka.server.KafkaServerStartable)Java.lang.IllegalArgumentException: requirement failed: C
在js中可以使用console.time和console.timeEnd来监测程序的运行耗时,以便优化性能。代码如下console.time('aa');for(var i=0;i<1000;i++){console.log(i);};console.timeEnd('aa')最后打印出aa:120ms表示aa之间的代码共耗时120ms
之前介绍过如何使用文件系统通过Logstash将数据推送至elasticsearch来实现日志的线上分析。而Logstash这次介绍通过logstash 将MySql数据同步至elasticsearchLogstash-MySql数据源配置最开始先看下MySQL作为数据来源时支持的所有配置input { jdbc { ### 查询参数的哈希,例如 { "target_id" =...
PHP基础 开发环境 PHP基本语法 PHP 标记符 <?php --- ?> 注释 //单行 /* 多行 */ # shell风格单行 PHP...
转载自:http://blog.csdn.net/chaod5659/article/details/8250845java开发中主要用到的jar包描述commons-io.jar:可以看成是java.io的扩展,用来帮助进行IO功能开发.它包含三个主要的领域:Utilityclasses-提供一些静态方法来完成公共任务.Filters-提供文件过滤器的各种实现.Streams-提供实用的S...
以下是代码,两个函数意思是分别读取excel表格的第一行和第二行,发起request请求,i代表行数,请教一下,可以怎样把以下代码合并?两个函数差别只在i不同而已。想要做到每读取一行excel表格的内容,就发一次request请求。 def test_request1(self): i = 0 logger.logger.logger.debug('测试用例...
TCP协议常见知识TCP协议特点 和 首部格式源端口(Source Port),目标端口(Destination Port) 各2字节源端口号,标识主机上发起传送的应用程序;目的端口标识主机上传送要到达的应用程序。源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上I P首部中的源端I P地址和目的端I P地址唯一确定一个TCP连接。一个I P地址和一个端口号...
使用VS2013版本引用外部的lib进行编译时候提示:错误25error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(jrtplibSend.obj 中)F:\jrtplibProjects\jrtplibSend\jrtplibSend\jrtplib.lib(rtpudpv6transmitter.obj)jrtpl...
【前言】 千山万水,斗转星移。于是精移神骇,忽焉思散。俯则末察,仰以殊观,睹一丽人,于岩之畔!【正文】 过去种种,历历在目。感觉有些脱离SLA,于是近日反思、追溯。总结入下:一、自己还应该继续听可视化的英语材料。听到对话常浮于脑中,影像与声音,能出似惊鸿,卧似游龙。二、与人英语沟通较少,原因是我实在是不喜欢AJ材料,可是大家都在听AJ、交