封装是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. 【UVA 1451】Average

    题 题意 求长度为n的01串中1占总长(大于L)的比例最大的一个子串起点和终点. 分析 前缀和s[i]保存前i个数有几个1,[j+1,i] 这段区间1的比例就是(s[i]-s[j])/(i-j),于是 ...

  2. 【CodeForces 624D】Array GCD

    题 You are given array ai of length n. You may consecutively apply two operations to this array: remo ...

  3. NOI题库-小学奥赛QwQ

    今天Loli教育我们让我们来看看NOI题库的奥赛部分,不过,为何是小学的( ⊙ o ⊙ )啊!感觉智商被各种侮辱. 余数相同问题: 描述 已知三个正整数 a,b,c. 现有一个大于1的整数x,将其作为 ...

  4. BZOJ4590 自动刷题机

    Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动 刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写 ...

  5. iOS推送失败的可能问题汇总

    ITC上的证书问题 AppID未开启推送 Provioning Profile在AppID开启推送功能前生成的 Provioning证书过期 推送的pem证书过期 客户端问题 target的CodeS ...

  6. HD2444The Accomodation of Students(并查集判断二分图+匹配)

    The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  7. Android:Touch和Click的区别

    http://blog.csdn.net/hufeng882412/article/details/7310142 针对屏幕上的一个View控件,Android如何区分应当触发onTouchEvent ...

  8. 工匠若水 Android应用开发编译框架流程与IDE及Gradle概要

    http://blog.csdn.net/yanbober/article/details/45306483 http://blog.csdn.net/yanbober/article/details ...

  9. [Angularjs]视图和路由(一)

    写在前面 对单页应用来讲,视图和路由的作用可以从一个视图跳转到另外一个视图,可以合理管理用户在使用过程中看到的界面. 将视图分解成布局和模版视图,并且根据用户当前访问的URL来展示对应的视图,将会是一 ...

  10. Js日期选择器并自动加入到输入框中

    <html> <head> <title>Js日期选择器并自动加入到输入框中</title> <meta http-equiv="con ...