Where are your from!!!!!!!!!!!! !Baby! {封装}
在说Java 三个特性之前,我们先了解一下什么是面向对象,以及为什么Java是面向对象的语言。 面向对象是区别于面向过程的一种编程的思想。我们可以通过这个例子冰箱装大象的例子来了解一下面向对象与面向过程的区别。 想必通过这个例子,应该清楚了面向对象与面向过程的区别。 面向过程是指我们主要注重于每一阶段的过程,而面向对象是指我们主要注重每一个动作的执行者。Java就是注重于动作的执行者,注重于编写类,注重于代码和功能复用的语言。
封装
上面我们已经说到了Java是注重于类的编写,那么封装自然也是对类的封装。对类封装有很多好处。
- 可以彻底隐藏方法的内部实现,仅仅提供一个调用的方法给其他人,让其他使用这个类的人不需要关心是如何实现的,只要知道该如何调用就行。
- 隐藏方法的内部实现的好处,可以让保留调用方法不变的同时,随意修改类的结构,而不影响其他人运行结果。
- 封装还会分开类的属性,将类的属性分成私有属性和公共属性。私有属性仅供类自身调用,和公共属性也仅提供一个供外部调用的方法。
- 按照软件的术语,良好的封装是能够减少耦合。
如何对一个类进行封装,则需要根据这个类本身的客观属性与实际的需要。 比如一个MyTime类
public class MyTime{
public String date;
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
date= df.format(new Date());
public String getDate() {
return date;
}
//
// public void setDate(String date) {
// this.date = date;
// }
}
显然这个类是只提供了显示系统的时间,不提供外部去修改系统时间的方法。这个也是根据类本身的客观属性而言,时间是固有不会人为改变的属性,当然诸如此类的例子,还有很多。我们只是简单举例来表明我们该如何设计类的外部访问方法。
访问权限
在上面的代码中,我们已经看到可以调用getData()方法对date进行访问,但是date的修饰符是public ,换句话说,我们完全可以new 一个MyTime对象对date属性进行修改和读值,这就违背了我们封装的初衷。所以,Java引入了不同的访问权限来限定这件事情。在《Java编程思想》中讲解了下述的访问权限 public:接口访问权限。也就是说public修饰的成员方法,属性都是可以在任何地方所访问的。 private: 你无法访问 。也就说private修饰的成员方法,属性 都是只能在这个类中被访问,出了这个类以外的地方,你是无法访问到这个类里面的内容,这十分的有用,我们上面的例子代码,因为是public修饰,所以会出现封装不彻底的问题,如果我们的成员变量date用private修饰,那么就会不出现上述的问题。 protected: 继承访问权限。在说到继承访问权限之前,我们思考这样一个问题,我们有一个基类,是需要被继承的。基类中的成员属性,我们是希望能被继承的类所访问,那么我们是可以把他设定成public,但是一旦这样的话,除了这个继承的类,其他类也会访问到。这个显然不是我们所期望的事情,所以Java引入protected修饰符,来表示所修饰的部分是能被派生的类所访问的,同时他也能被同一包里面的其他类所访问。 所以,总结一下,如果我们是希望类中的方法和属性能被所有类所访问,就用public,如果只是能被继承的类和同一包内的类所访问就用protected,如果只是希望在当前类中所访问,不能被其他任何类访问就要用private。
总结
在了解了封装的具体含义和好处之后,我们就可以利用上面的访问权限来对我们要向封装的东西进行封装,通过访问权限来隐藏具体的实现,和提供外部访问的接口。
public class Student {
private String name;
private String age;
private String handleName(String name){
return "I'm " + name;
}
private String handleAge(String age) {
return age + " 岁";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = handleName(name);
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = handleAge(age);
}
}
在上面的例子中,我们对Student类进行了简单的封装,首先我们切断了外部直接调用到name,age的可能,通过set和get方法来提供访问到name,age的方法,同时,上面的例子中也体现出来了,在外部访问方法不变的情况下,自己随意修改内部的实现,我们首先编写了只供类内部调用的Handle的方法,用Handle方法来修改name,age的显示结果。这样确保了修改显示结果的方法只能自己调用,而且在外部访问不变的情况下,根据需求修改内部的实现。这也是一个简单的封装例子。其调用的例子如下:student对象只能调用如下的内容,其他我们自己编写的内容是无法调用的。
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.setName("byhieg");
student.setAge("23");
System.out.println(student.getName() + " " + student.getAge());
}
}
Where are your from!!!!!!!!!!!! !Baby! {封装}的更多相关文章
- 如何将Js代码封装成Jquery插件
很多相同的Jquery代码会在很多页面使用,每次都复制粘贴太麻烦了,不如封装成一个Jquery插件就方便了,至于影响网页的速度不,我就没有测试了哈. 代码如下 这是一个自定闪烁打印文字的Jquery特 ...
- 关于telnet协议的研究以及用java进行封装实现自己的telnet客户端(转)
最近在做一个远程控制的模块,其中用到了telnet协议,开始用的是apache-net包的telnetclient,但发现问题不少,比较慢,还有就是判断是否read完毕的问题.后来经过讨论打算实现自己 ...
- //封装tabs函数
//封装tabs函数function tabs(tabTit,on,tabCon){ $(tabCon).each(function(){ $(this).children().eq(0).show( ...
- nodejs版本DESede/CBC/PKCS5Padding算法封装(3des)
最近对接了一个第三方支付项目,用的加密算法是根本没听过的:DESede/CBC/PKCS5Padding 这个算法真的是坑爹了,网上搜索了一堆只有java版本是正常的,nodejs版本的各种问题,我了 ...
- [C#] 简单的 Helper 封装 -- RegularExpressionHelper
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- iOS开发之App间账号共享与SDK封装
上篇博客<iOS逆向工程之KeyChain与Snoop-it>中已经提到了,App间的数据共享可以使用KeyChian来实现.本篇博客就实战一下呢.开门见山,本篇博客会封装一个登录用的SD ...
- Ajax实现原理,代码封装
都知道实现页面的异步操作需要使用Ajax,那么Ajax到是怎么实现异步操作的呢? 首先需要认识一个对象 --> XMLHttpRequest 对象 --> Ajax的核心.它有许多的属性和 ...
- 用C语言封装OC对象(耐心阅读,非常重要)
用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...
- 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~
一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...
随机推荐
- aop技术理解使用
一.什么是AOP? aop技术是面向切面编程思想,作为OOP的延续思想添加到企业开发中,用于弥补OOP开发过程中的缺陷而提出的编程思想.AOP底层也是面向对象:只不过面向的不是普通的Object对 ...
- Shadow Properties之美(二)【Microsoft Entity Framework Core随笔】
接着上一篇Shadow Properties之美(一),我们来继续举一个有点啰嗦的栗子. 先看简单需求:某HR系统,需要记录员工资料.需要记录的资料有: 员工号(规则:分公司所在城市拼音首字母,加上三 ...
- complex类的定义和实现
#include<iostream> #include<cmath> using namespace std; class complex { public: complex( ...
- ecplise多个版本tomcat的使用
在ecplise中修改配置文件,或者直接在server.xml中修改,将tomcat三个端口号修改为与另一个tomcat不同即可.
- H5手指滑动切换卡片效果
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- Python基础(条件判断,循环,占位符等)
Python 自动化 系统开发用的语言和自动化脚本可以不同 学习peython可用于: 网路爬虫,数据分,web开发,人工智能,自动化运维,自动化测试,嵌入式,黑客 第三方库比较全 脚本语言:功能单一 ...
- CentOS系统Nginx安装配置,随时更新
./configure --prefix=/etc/nginx \ #指定安装目录 --sbin-path=/usr/sbin/nginx \ #指定执行路径--conf-path=/etc/ngin ...
- 解决使用mybatis分页插件PageHelper的一个报错问题
在项目中使用PageHelper进行分页,启动运行时报错,报错如下: 27-Aug-2017 09:58:48.017 INFO [localhost-startStop-1] org.apache. ...
- 《团队-爬虫豆瓣top250项目-团队一阶段互评》
团队名称:咣咣踹电脑 学号:2015035107217姓名:耿文浩 得分10 原因:组长带领的好,任务分配的好,积极帮助组员解决问题 学号:2015035107213姓名:周鑫 得分8 原因:勇于分担 ...
- SpringBoot中的ajax跨域问题
在控制类加入注释@CrossOrigin(allowCredentials = "true",allowedHeaders = "*",origins = {& ...