java封装是什么?

在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。

封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。

要访问该类的代码和数据,必须通过严格的接口控制。

封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。

适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。

封装的优点

1. 良好的封装能够减少耦合。

2. 类内部的结构可以自由修改。

3. 可以对成员变量进行更精确的控制。

4. 隐藏信息,实现细节。

Java面向对象的封装

封装是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封装是什么_java封装是什么?Java面向对象的封装相关推荐

  1. Java改知能机_Java 面试突击之 Java 并发知识基础 进阶考点全解析

    版权说明:本文内容根据 github 开源项目整理所得 项目地址:https://github.com/Snailclimb/JavaGuide​github.com 一.基础 什么是线程和进程? 何 ...

  2. java 基础知识巩固_Java基础巩固——《Java核心技术基础·卷一:基础知识》

    阅读记录追踪:前言部分 阅读前先看:简介.目录和勘误! Java编程语言是一种多用途.并发的.基于类的.面向对象的编程语言:编译时通常包括将持续转化成机器无关的字节码表示.运行时活动包括加载和链接执行 ...

  3. java date sql和_Java.util.date 与 java.sql.date区别和转换

    1.将java.util.Date转换为java.sql.Date java.sql.Date sd; java.util.Date ud; //initialize the ud such as u ...

  4. java语言编程基础_Java编程基础02——Java语言基础

    1_(常量的概述和使用)* A:什么是常量(constant) 在程序执行的过程中其值不可以发生改变 B:Java中常量的分类 字面值常量 自定义常量(面向对象部分讲) C:字面值常量的分类 字符串常 ...

  5. java打印线程堆栈_Java问题定位之Java线程堆栈分析

    采用Java开发的大型应用系统越来越大,越来越复杂,很多系统集成在一起,整个系统看起来像个黑盒子.系统运行遭遇问题(系统停止响应,运行越来越慢,或者性能低下,甚至系统宕掉),如何速度命中问题的根本原因 ...

  6. java环境陪孩子_Java启蒙之路-Java开发环境搭建与第一个Java程序

    Java开发环境搭建 "工欲善其事,必先利其器",从前面的章节我们了解到,Java程序的运行过程首先编写Java程序,然后再对Java源文件编译,借助JVM运行程序.现在问题来了, ...

  7. java字节码转换_Java源程序如何变成Java字节码?

    谢邀,题主的问题主要涉及到编译和反编译相关的知识,简单帮你回答一下. 编程语言 在介绍编译和反编译之前,我们先来简单介绍下编程语言(Programming Language).编程语言(Program ...

  8. java 2d 绘图教程_Java标准教程:Java 2D绘图--第2章 从绘图开始

    Java标准教程:Java 2D绘图--第2章从绘图开始 Java 2D API是强大并且复杂的.然而,大多数Java 2D API只用到了封装在java.awt.Graphic类中的功能的自己.本节 ...

  9. java开发怎么包装_Java开发知识之Java的包装类

    Java开发知识之Java的包装类 一丶什么是包装类 包装类的意思就是对基本数据类型封装成一个类.这些类都是Number的子类.区别就是封装数据类型不同.包含的方法基本相同. 具体可以查询JAVA A ...

  10. java动物类问题_java实现动物特性的面向对象的描述(三个阶段)

    动物特性描述 狗生活在陆地上(是一种陆生动物),既是哺乳类的也是肉食性的.狗通常的时候和人打招呼会通过"摇摇尾巴",在被抚摸感到舒服的时候,会"旺旺叫",而在受 ...

最新文章

  1. flower.php,flowerlist.php
  2. 聊聊动画引擎 pop
  3. 数据库进阶系列之三:使用Logminer解析Oracle日志
  4. Dancing Naked in the Mind Field
  5. 红帽产品及技术总裁:未来IT趋势预测
  6. PHP——0128练习相关2——js点击button按钮跳转到另一个新页面
  7. IOS开发人员必看的精品资料100
  8. 安装axios时报错
  9. php studay,studay是什么意思
  10. 什么是CPU密集型?什么是IO密集型?
  11. 麦吉尔大学计算机工程的世界排名,麦吉尔大学计算机工程本科.pdf
  12. 最新WIFI分销大师小程序源码+带后端/亲测可用
  13. 3dsmax渲染AVI格式动画的画面不清晰
  14. 如何利用阿里物联网做一个会自动浇水的花盆
  15. JavaScript高级程序设计(第4版)学习随笔【第三章】
  16. ARM GICv3 GIC代码分析
  17. oracle sql数据计算精度问题
  18. 大数据运维架构师培训(1):Zookeeper,Hadoop(HDFS,MR,Yarn)
  19. vivado中设置多核编译
  20. Power Query (Power BI)傻瓜式合并资产负债表,史上最好用

热门文章

  1. 螺丝钉拧不下来了怎么办
  2. 维智科技位列顶尖BI服务商,时空AI赋能商业生态数据价值最大化
  3. 学习笔记——搞懂FST数据结构
  4. Quark-Renderer----第五篇
  5. 数实融合大时代已至,且看腾讯云的落子与布局
  6. 建立SQLserver表的基本操作
  7. java幂等的实现方案_java的幂等性
  8. Dialogue System for Unity文档中英对照版(简雨原创翻译)完结篇(内置脚本使用,脚本API)
  9. 【随笔】关于 “关注博主即可阅读全文”
  10. inflate方法两个参数和三个参数的区别