封装是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. Chrome商店Crx离线安装包下载

    第一步:找到Chrome的扩展应用ID 第二步:输入扩展应用ID 第三步:单击 生成 按钮. 第四步:在这里右键另存为即可下载.

  2. 使用X-UA-Compatible来设置IE浏览器兼容模式

    文件兼容性用于定义让IE如何编译你的网页.此文件解释文件兼容性,如何指定你网站的文件兼容性模式以及如何判断一个网页该使用的文件模式. 前言 为了帮助确保你的网页在所有未来的IE版本都有一致的外观,IE ...

  3. Oracle自定义函数

    核心提示:函数用于返回特定数据.执行时得找一个变量接收函数的返回值; 语法如下: create or replace function function_name ( argu1 [mode1] da ...

  4. 44.Android之Shape设置虚线、圆角和渐变学习

    Shape在Android中设定各种形状,今天记录下,由于比较简单直接贴代码. Shape子属性简单说明一下:  gradient -- 对应颜色渐变. startcolor.endcolor就不多说 ...

  5. 利用Spring中的HtmlUtils.htmlEscape(input)过滤html

    fatherModule.setModuelName(HtmlUtils.htmlEscape(fatherModule.getModuelName())); log.info(HtmlUtils.h ...

  6. bzoj1670 Usaco2006 Building the Moat护城河的挖掘 [凸包模板题]

    Description 为了防止口渴的食蚁兽进入他的农场,Farmer John决定在他的农场周围挖一条护城河.农场里一共有N(8<=N<=5,000)股泉水,并且,护城河总是笔直地连接在 ...

  7. VMware 11安装Mac OS X 10.11.5虚拟机以及优化心得

    随着苹果WWC大会退出了MAC最新版的10.11.5,本着一颗“极客”的心情,在第一时间用VMWARE虚拟机装上了.然后各种卡顿这里分享一下优化mac虚拟机的心得. 1 从Dock上移除Dashboa ...

  8. Laravel教程 四:数据库和Eloquent

    Laravel教程 四:数据库和Eloquent 此文章为原创文章,未经同意,禁止转载. Eloquent Database 上一篇写了一些Laravel Blade的基本用法和给视图传递变量的几种方 ...

  9. HTML 5 应用程序缓存

    使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本. 什么是应用程序缓存(Application Cache)? HTML5 引入了应用程序缓存,这 ...

  10. C语言计算任意数的任意次方

    #include "stdio.h" #include"stdlib.h" #define max 500 void yiwei(int *a,int n,in ...