在说Java 三个特性之前,我们先了解一下什么是面向对象,以及为什么Java是面向对象的语言。 面向对象是区别于面向过程的一种编程的思想。我们可以通过这个例子冰箱装大象的例子来了解一下面向对象与面向过程的区别。 想必通过这个例子,应该清楚了面向对象与面向过程的区别。 面向过程是指我们主要注重于每一阶段的过程,而面向对象是指我们主要注重每一个动作的执行者。Java就是注重于动作的执行者,注重于编写类,注重于代码和功能复用的语言。

封装

上面我们已经说到了Java是注重于类的编写,那么封装自然也是对类的封装。对类封装有很多好处。

  1. 可以彻底隐藏方法的内部实现,仅仅提供一个调用的方法给其他人,让其他使用这个类的人不需要关心是如何实现的,只要知道该如何调用就行。
  2. 隐藏方法的内部实现的好处,可以让保留调用方法不变的同时,随意修改类的结构,而不影响其他人运行结果。
  3. 封装还会分开类的属性,将类的属性分成私有属性和公共属性。私有属性仅供类自身调用,和公共属性也仅提供一个供外部调用的方法。
  4. 按照软件的术语,良好的封装是能够减少耦合。

如何对一个类进行封装,则需要根据这个类本身的客观属性与实际的需要。 比如一个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! {封装}的更多相关文章

  1. 如何将Js代码封装成Jquery插件

    很多相同的Jquery代码会在很多页面使用,每次都复制粘贴太麻烦了,不如封装成一个Jquery插件就方便了,至于影响网页的速度不,我就没有测试了哈. 代码如下 这是一个自定闪烁打印文字的Jquery特 ...

  2. 关于telnet协议的研究以及用java进行封装实现自己的telnet客户端(转)

    最近在做一个远程控制的模块,其中用到了telnet协议,开始用的是apache-net包的telnetclient,但发现问题不少,比较慢,还有就是判断是否read完毕的问题.后来经过讨论打算实现自己 ...

  3. //封装tabs函数

    //封装tabs函数function tabs(tabTit,on,tabCon){ $(tabCon).each(function(){ $(this).children().eq(0).show( ...

  4. nodejs版本DESede/CBC/PKCS5Padding算法封装(3des)

    最近对接了一个第三方支付项目,用的加密算法是根本没听过的:DESede/CBC/PKCS5Padding 这个算法真的是坑爹了,网上搜索了一堆只有java版本是正常的,nodejs版本的各种问题,我了 ...

  5. [C#] 简单的 Helper 封装 -- RegularExpressionHelper

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. iOS开发之App间账号共享与SDK封装

    上篇博客<iOS逆向工程之KeyChain与Snoop-it>中已经提到了,App间的数据共享可以使用KeyChian来实现.本篇博客就实战一下呢.开门见山,本篇博客会封装一个登录用的SD ...

  7. Ajax实现原理,代码封装

    都知道实现页面的异步操作需要使用Ajax,那么Ajax到是怎么实现异步操作的呢? 首先需要认识一个对象 --> XMLHttpRequest 对象 --> Ajax的核心.它有许多的属性和 ...

  8. 用C语言封装OC对象(耐心阅读,非常重要)

    用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...

  9. 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~

    一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...

随机推荐

  1. C# [Win32] [GDI+] [API] Load HFONT from Memory

    // gdiplusenums.h //-------------------------------------------------------------------------- // Fo ...

  2. 执行git命令时出现fatal: 'origin' does not appear to be a git repository错误

    在执行git pull origin master时出现: fatal: 'origin' does not appear to be a git repository fatal: Could no ...

  3. python1-集合、函数-(全局变量与局部变量)

    集合 # s=set('hello')# print(s)## s=set(['alex','alex','sb'])# print(s) # s={1,2,3,4,5,6} #添加# s.add(' ...

  4. 表单传参,在action中的参数得不到

    写上面这个的时候,发现传过去的url路径是这样的 在action后面的pro=login得不到. 只需要将method中的get改成post就可以了

  5. Database First/Code First

  6. JS---作用域和作用域链

    JS---作用域和作用域链 作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期.在JavaScript中,变量的作用域有全局作用域和局部作用域两种. //常犯的一个错误 &l ...

  7. Nim函数调用的几种形式

    Nim函数调用的几种形式 Nim 转载条件:如果你需要转载本文,你需要做到完整转载本文所有的内容,不得删改文内的作者名字与链接.否则拒绝转载. 关于nim的例行介绍: Nim 是一门静态编译型的系统级 ...

  8. GitHub入门与实践 读书笔记三:(1)GitHub账户注册教程

    第一步:进入GitHub官网,官网地址:https://github.com/ 第二步:点击Sign up for GitHub 1.昵称一栏:每次在你输入昵称之后,都会检查是否已经被注册.如果被注册 ...

  9. Linux:Fedora系统的安装

    新的一周,新的一天又来了!话不多说我们直接进入今天的系统安装吧!这次是Linux系统的第八期了,这款系统是可以当做家庭用途使用,非常强大的一款开发源操作系统. 安装Fedora系统 系统映像文件下载 ...

  10. python基础13_zip_import

    继续内置函数,zip函数被比喻成拉链,将两边的齿对应起来. #!/usr/bin/env python # coding:utf-8 ## 比喻像个拉链,将两边对应起来. # 多出来的部分,不作处理. ...