• 软件开发追求的境界:高内聚,低耦合

高内聚:尽可能把模块的内部数据,功能实现细节隐藏在模块内部独立完成,不允许外部直接干预

低耦合:仅暴露少量的方法给外部使用



  • 到底为什么要对一个雷或者对象实现良好的封装,可以实现以下目的:

1,隐藏类的实现细节

2,让使用者只能通过实现预定的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对属性的不合理访问

3,还可以进行数据检查,有利于保证对象信息的完整性

4,便于修改,提高代码的可维护性





  • 为了实现良好的封装,需要从2个方面来考虑

1,把对象的属性和实现细节隐藏起来,不允许外部直接访问

2,把方法暴露出来,让方法来控制对这些属性进行安全的访问和操作

去餐馆吃饭,我们只要能吃到菜就OK了,至于这个厨师长啥样,单眼皮还是双眼皮,怎么做的菜,用了什么牌子的地沟油,我们都没必要知道。我们使用的电脑其实就是体现了封装的思想,它里面什么网卡,声卡是怎么插放的,怎么设计的,我们不要知道,我们只需打开电脑就可以用了。这就如同找一个人来修电脑,只需要知道修好了还是没修好。至于他怎么修的可以不用了解。可是封装好了,外界怎么使用呢?(向外暴露一些简单的入口,供使用)
        方法是类中最小的封装体。那么类也一样是一种封装形式,有写方法需要暴露出去,有些就不用。



  • 访问权限控制: 

private:本类内部可以访问,不能继承到子类

default:本类内部可以访问,同包其他类也可以访问。同包可继承

protected:本类内部可以访问,不同包的子类也可以访问,同包其他类也可以访问。能继承到子类

public:任何地方都可以访问  ,能继承到子类



以下图片整理的很好:



修饰符

类内部

同一个包

子类

任何地方

private

default

protected

public





  • 关于访问控制符的使用,存在以下原则:

1,类中的绝大部门属性都应该使用private修饰,只有一些static修饰的,类似全局变量的属性,才使用public

2,如果某个类主要用作其他类的父类,那么应该使用protected来修饰这个类的方法

3,希望暴露给其他类调用的方法使用public来修饰

注意了:如果一个java源文件里定义了一个public修饰的类,则这个源文件的文件名必须与public修饰的类的类名相同



  • JavaBean规范:

一个类必须有一个参数为空的构造方法,所有的字段必须使用private修饰;并向外提供getter/setter。

若字段的第二个字母是小写的,把第一个字母变成大的,再加上get/set作为前缀(最常见的)。

若第二个字母是大写的,就保持原样再加上get/set(特殊)。

注意了:boolean 类型的变量没有getXX,只有 isXX;





以下是一个标准的javabean,代码如下:

  1. /**
  2. *
  3. * @version 1L
  4. * @author LinkinPark
  5. * @since 2014-10-27
  6. * @motto 梦似烟花心似水,同学少年不言情
  7. * @desc ^封装实际上就是2个方面的含义:把该隐藏的隐藏起来,把该暴露的暴露出来
  8. */
  9. public class JavaBean {
  10. //使用private修饰,将这些属性隐藏起来,要是想修改这个类的属性,提供get和set方法
  11. private String name;
  12. private int age;
  13.  
  14. public JavaBean(){
  15.  
  16. }
  17.  
  18. public String getName() {
  19. return name;
  20. }
  21.  
  22. public void setName(String name) {
  23. //在这里还可以加入自己的逻辑判断
  24. if("LinkinPark".equals(name)){
  25. System.out.println("不可以的,林肯公园是偶的名字,不能随便拿来赋值");
  26. return;
  27. }else{
  28. this.name = name;
  29. }
  30. }
  31.  
  32. public int getAge() {
  33. return age;
  34. }
  35.  
  36. public void setAge(int age) {
  37. //保证自己写的类的属性不要出现与实际情况不符的情况
  38. if(age>100 || age<0){
  39. System.out.println("");
  40. }else{
  41. this.age = age;
  42. }
  43. }
  44.  
  45. }

linkin大话面向对象--封装和隐藏的更多相关文章

  1. linkin大话面向对象--内部类

    内部类说白了就是类中有类 内部类:嵌套类 外部类:宿主类 内部类主要有以下作用:记住了3个字:多继承... 1,内部类提供了更好的封装,可以把内部类隐藏在外部类中,不允许同一个包中的其他类访问该类. ...

  2. linkin大话面向对象--组合

    继承是实现类重用的重要手段,但是它有一个最大的坏处:破坏封装.相比之下,组合也是实现类重用的重要方式,但是采用组合方式实现类重用则能提供更好的封装性.比如人有手一样,在人的类中增加一个手的属性. 何时 ...

  3. linkin大话面向对象--类和对象

    我们每天在撸码,那么我们在敲什么东西呢?明显的我们在写类,写一个类,写一个接口,写某个接口里面写一些属性,在某个类里面写一个方法,然后以一个对象调用方法,对于j2ee来讲的话,可能还会写一些jsp,静 ...

  4. linkin大话面向对象--闭包和回调

      先来理解2个概念:闭包和回调   什么是闭包? 闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建他的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为他不仅包含了外部类对象的信 ...

  5. linkin大话面向对象--多态

    java引用变量有2个类型,一个是编译时类型,一个是运行时类型: 编译时类型:声明的类型,把它看做是什么东西 运行时类型:真正的类型,实际上指的是什么东西 如果编译时类型和运行时类型不同,就出现多态. ...

  6. linkin大话面向对象--继承

    [修饰符] class SubClass extends SuperClass    按照这种关系,我们把SuperClass类称为父类或基类,把SubClass称为子类或派生类或拓展类.extend ...

  7. linkin大话面向对象--构造器详解

       对象的产生格式:类名称  对象名 = new  类名称(); 因为有(),所以是方法,实际上它就是构造方法,并且是非私有的构造方法.如:CellPhone cp = new CellPhone( ...

  8. linkin大话面向对象--GC和jar包

    GC java的垃圾回机制是java语言的重要机制之一.当程序创建对象,数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存区中.当这块内存不再被任何变量引用时,这块内存就 ...

  9. linkin大话面向对象--枚举

    枚举类(enum) 其实我们使用到枚举的地方还是很多的,其实我们可以完全人工的来实现枚举的功能.比如说我现在手里的项目我就是自己实现的枚举,说白了,枚举就是一个类的多例模式. 1,使用enum声明,默 ...

随机推荐

  1. Juicer模板引擎使用笔记

    关于Juicer:Juicer 是一个高效.轻量的前端 (Javascript) 模板引擎,使用 Juicer 可以是你的代码实现数据和视图模型的分离(MVC). 除此之外,它还可以在 Node.js ...

  2. smtplib 报错501

    昨天用stmplib写了一个自动发送的邮件的小程序. 之前能够正常运行,到了下午发现报错. 报错信息:smtplib.SMTPSendRefused(501,b'\xc7\xeb\xb5\xc7\xc ...

  3. ABP Zero 导航菜单之角色权限

    本文的项目是官网生成,项目名称为XX,WEB为MVC,以Users权限模块为例解说文章. 1.定义PermissionNames PermissionNames是一个静态类,它在/XX.Core/Au ...

  4. 高可用高性能分布式文件系统FastDFS进阶keepalived+nginx对多tracker进行高可用热备

    在上一篇 分布式文件系统FastDFS如何做到高可用 中已经介绍了FastDFS的原理和怎么搭建一个简单的高可用的分布式文件系统及怎么访问. 高可用是实现了,但由于我们只设置了一个group,如果现在 ...

  5. JavaScript中的 true

    经常看到有人写 如下代码,有时候也是凭经验猜想到底是什么意思,本着认真学习 JavaScript 的精神,专门写一篇去讨论这个问题. if(name){ //do something. }else{ ...

  6. 在HTML页面中获取当前项目根路径的方法

    在HTML页面获取项目根路径的方法: function getRootPath(){ var curPageUrl = window.document.location.href; var rootP ...

  7. UVA 11039-Building designing【贪心+绝对值排序】

    UVA11039-Building designing Time limit: 3.000 seconds An architect wants to design a very high build ...

  8. Vijos P1448 校门外的树【多解,线段树,树状数组,括号序列法+暴力优化】

    校门外的树 描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,K= ...

  9. [bzoj1774] [Usaco2009 Dec]Toll 过路费

    Floyd神用法...设dis[i][j]表示i点到j点的最短路(只算边权),map[i][j]表示i到j最小费用 将n个点先按照点权排一下序...这样就可以比较方便的求出路径上最大点权了... 因为 ...

  10. Dora.Interception, 一个为.NET Core度身打造的AOP框架:不一样的Interceptor定义方式

    相较于社区其他主流的AOP框架,Dora.Interception在Interceptor提供了完全不同的编程方式.我们并没有为Interceptor定义一个接口,正是因为不需要实现一个预定义的接口, ...