封装是Java面向对象的三大特性之一,通常我们是通过包管理机制同时对类进行封装,隐藏其内部实现细节,通常开发中不允许直接操作类中的成员属性,所以属性一般设置为私有权限private,类中一般会给出一些公共方法来让使用者通过特定方法读取或者操作里面的数据,避免误操作从而保证了数据的安全。

  封装步骤一般分为3步,第一步首先修改属性的可见性,即将其设置为private;第二步创建getter/setter方法,用于获取/设置属性值,就是用来读写属性,eclipse中也提供了直接生成变量操作方法的菜单,选择菜单中的Source->Generate Getters and Setters...系统就会自动识别属性,我们可以选择创建;第三步是在getter/setter方法中加入属性控制,控制传入参数的合法性,保证数据安全。

  简单示例如下:

 public class Hello {
private float screen;
private float width;
private float height;
public float getScreen(){
return screen;
}
public void setScreen(float screen){
screen = screen;
}
}

那么我们读写Hello中screen属性是,可以使用我们定义的getScreen和setScreen来进行读和写,这就简单的实现的封装

当然我们在其他方法中也可以对需要的属性进行修改,但是我们专门用于实现读写逻辑时使用getter/setter方法是一个约定俗成的编程习惯

访问修饰符

前面的访问修饰符除了private和public之外,还有protected,还可以什么都不写,他们的权限关系如下图所示:

我们一般对类内部的属性使用private,这个属性保护最强,保护最弱的就是public属性,最常用的属性也就是public和private,访问修饰符一般放在成员最前面。

this关键字

上面的实例中,setScreen方法中的赋值语句,我么使用了screen = screen;这样虽然没什么错误,但编译器会给出警告,原因是方法参数和成员属性名一样,有可能导致混淆,为了区分本类中的属性和参数我们一般使用this关键字,即this.screen = screen;普通方式调用本类中的方法名除了直接写方法之外推荐使用this.func();这种形式调用本类中的方法

Java内部类

Java内部类就是定义在一个类内部的类,包含这个内部类的类就称为外部类

内部类可以实现更好的封装,把内部类隐藏在外部类之中,同一个包中也无法使用

内部类的方法可以直接访问外部类的所有属性,包括私有的

内部类实现的所有功能单类都可以实现,只是有些时候有了内部类更方便一些

内部类分为:成员内部类、静态内部类、方法内部类、匿名内部类

1、成员内部类

成员内部类也就是普通内部类,可以直接访问外部类中的所有成员,不用担心任何权限问题;

但是外部方法不能直接访问成员内部类中的属性或者方法,比如外部类名HelloWorld,内部类名Inner,外部类方法访问内部类成员的方法为:

  HelloWorld he = new HelloWorld();

  Inner in = he.new Inner();

  或者直接用

  Inner in = HelloWorld.new Inner();

然后通过in.属性/方法,就可以访问成员内部类了,当编译程序后,会生成2个class文件,一个是内部类生成的,一个是外部类生成的

外部类编译文件名为:HelloWorld.class 注意内部类编译文件名为:HelloWorld$Inner.class

另外内部类和外部类具有相同的成员变量和方法的时候,内部类根据就近原则优先访问自己类中的成员,要想访问外部类中的,需要使用this.成员来实现

2、静态内部类

静态内部类不能像成员内部类一样直接访问外部类中的非静态成员,可以通过new 外部类().成员来实现访问

静态内部类访问外部类静态成员可以直接使用成员名来访问,重名的话使用下一句的方法访问

如果外部类静态成员和内部类成员重名(注意不仅仅是静态成员),那么可以直接访问内部成员,外部静态成员访问使用 类名.成员 来访问

在外部类中创建静态内部类的对象时,不需要成员内部类那样需要先实例化外部对象,可以直接 内部类 对象名 = new 内部类();来创建内部类的对象

3、方法内部类

方法内部类,就是内部类的定义位置是在外部类的方法中,这个不用考虑太复杂,方法内部类只在该方法内部可见,所以一句话只能在方法内部使用

方法内部使用很简单,直接用 内部类 对象名 = new 内部类();就可以访问内部类成员了

因为方法内部类不能在所属方法以外任何地方访问,因此方法内部类不能使用访问控制符和static关键字,简单的写法如下:

 public class Hello {
public void show(){
//定义方法内部类,不加任何修饰符
class MInner{
//方法内部类成员,需要加访问修饰符
int a = 3;
public int getA(){
return a + 6;
}
}
//创建方法内部类对象
MInner mi = new MInner();
//调用方法内部类方法
int score = mi.getA();
System.out.println("调用结果:" + score);
}
public static void main(String[] args){
//测试方法内部类
Hello mo = new Hello();
mo.show();
}
}

通过这个例子,就容易看出方法内部类的使用了

4、匿名内部类

匿名内部类就是没有名字的内部类,只能使用一次,通常连贯起来,用来简化代码的书写,匿名内部类必须继承一个父类或者实现一个接口,后面记录面向对象的继承和多态的时候会提到,这里就不细说了

封装基本的知识就是这些,当然还有很多有用的东西值得去提炼,有了新东西再继续总结

Java面向对象的封装的更多相关文章

  1. Java面向对象(封装性概论)

     Java面向对象(封装性概论) 知识概要:                   (1)面向对象概念 (2)类与对象的关系 (3)封装 (4)构造函数 (5)this关键字 (6)static关键 ...

  2. java面向对象(封装,继承,多态,抽象,接口的定义和实现)

    1.封装 在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定 ...

  3. Java面向对象之封装

     面向对象的三个特征:封装.继承和多态. Java开发的过程就是找合适的库对象使用,没有对象创建新对象.找对象,建立对象,使用对象并维护对象之间的关系. 类就是对现实生活中事物的描述,而对象就是这类事 ...

  4. java面向对象(封装-继承-多态)

    框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...

  5. Java面向对象之封装 入门实例(一)

    一.基础概念 (一)面向对象的三大特征:      1.封装         2.继承          3.多态 (二)封装:隐藏实现细节,对外提供公共的访问方式(接口). 封装的体现之一:将属性都 ...

  6. java面向对象之封装性

    面向对象的特征之一:封装和隐藏: 一.问题的引入: 当创建一个类的对象以后,可以通过“对象.属性”的方式,对对象的属性进行赋值.这里,赋值操作要受属性的数据类型和存储范围的制约.除此之外,没有其他制约 ...

  7. Java 面向对象,封装,继承

    1相关概念的理解 1.1面向过程.面向对象 面向过程与面向对象都是编程中,编写程序的一种思维方式. 面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程.(职员思想) 面向 ...

  8. Java 面向对象和封装

    目录 面向对象思想的概述 类和对象的关系 什么是类 什么是对象 类和对象的关系 局部变量和成员变量的区别 this关键字 构造方法 一个标准的类 面向对象思想的概述 面向过程:当需要实现一个功能的时候 ...

  9. Java面向对象07——封装

    封装 (补充 this关键字):  package oop.demon01.demon03; ​ /*    封装的意义:        1. 提高程序的安全性,保护代码        2. 隐藏代码 ...

随机推荐

  1. .net Int16 、(int Int32)、 Int64 的区别

    关于什么是16位整数,32位整数,64位整数,请看这里:http://www.cnblogs.com/EasonJim/p/4837061.html Int16 值类型表示值介于 -32768 到 + ...

  2. 洛谷P1993 小 K 的农场

    题目描述 小 K 在 Minecraft 里面建立很多很多的农场,总共 n 个,以至于他自己都忘记了每个 农场中种植作物的具体数量了,他只记得一些含糊的信息(共 m 个),以下列三种形式描 述: 农场 ...

  3. 桂电在linux环境下使用出校器

    一.官方出校器(无界面) 由于学校官方最新的linux版出校器无效,我们只能使用老版本的出校器了. 但因为老版本的出校器是32位的,而现在主流使用的是64位系统,因此我们得安装32位库. 在ubunt ...

  4. ExtJS入门教程05,grid的异步加载数据

    上一篇演示了extjs grid的基本用法,并加载了本地数据.今天我们将演示如何加载异步数据. 所谓异步,就是通过ajax的方式将服务器端的数据加载到我们的grid中.为了提供数据,我们先定义一个数据 ...

  5. 在ECSHOP后台左侧导航中增加新菜单

    在ECSHOP后台左侧导航中增加新菜单 ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2011-11-08   有个别高级用户(懂PHP的),提到这样的问题: 在后台管 ...

  6. 神器Alfred使用

    神器官网:http://www.alfredapp.com/ 许多人装好了之后就再也没有怎么使用过,这软神器, 一直不明白它为什么叫神器,最近研究了一下,真的是,很多东西我们没有好好利用 部分使用功能 ...

  7. 常用webshell提权方法总结

    pcAnywhere提权:1.利用pcAnywhere提权,前提条件是pcAnywhere默认安装到默认路径,以及它的目录安全权限有users权限,如果管理员删除了users和power users用 ...

  8. Linux下memcache的安装和启动(转)

    memcache是高性能,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度.据说官方所说,其用户包括twitter.digg.flickr等,都是些互联网大腕呀.目前用memca ...

  9. 远程桌面连接不上|windows server 2003 sp2 termdd.sys(转载)

    远程桌面连接不上|windows server 2003 sp2 termdd.sys.请教一个问题,为什么 Windows Server 2003 打上SP2补丁,就不能通过远程桌面连接上去了?服务 ...

  10. Ubuntu 为网卡配置静态IP地址

    为网卡配置静态IP地址编辑文件/etc/network/interfaces:sudo vi /etc/network/interfaces并用下面的行来替换有关eth0的行:# The primar ...