JAVA面向对象三大特征之——封装 java面向对象的封装

前言

我们知道,Java是面向对象的编程语言。关于面向对象的概念,我们在之前的文章中就已经给大家详细地讲过了。但是关于面向对象,我们还有另一块不得不学的内容,那就是面向对象的特征

可以说,面向对象的三大特征,是我们每个java程序员都必须掌握的基本功。在日常的开发中,每段java代码的编写实现,都应该体现出这些特征的基本要求。另外在我们面试的时候,面向对象的特征更是初级程序员的必考要点,面试官动不动就来一句:你给我说说面向对象的特征有哪些吧。


全文大约【2500】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富的案例及配图,让你更好地理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考

一. 三大特征

我们知道,面向对象是一种以对象为核心的软件开发思想。在这种编程思想中,有着明显的几个特征,通常我们归纳为如下三个:

封装(Encapsulation):将类或接口的实现细节部分包装、隐藏起来。

继承(extends):子类继承父类的特征和行为,使得子类对象(实例)拥有父类的实例域和方法;或子类从父类继承方法,使得子类拥有父类相同的行为。

多态(polymorphism):同一个行为具有多个不同表现形式或形态的能力,即同一个接口可以使用不同的实例执行不同的操作。

但也有的面试官会问我们面向对象有哪四大特征?这就让人很懵,不都是三大特征吗?如果非要有这种问法,那我们就可以再多回答一个“抽象”的概念即可。

关于继承、多态和抽象等的概念,我们会在后面的文章中单独讲解,本篇文章先只讲封装是怎么回事。

二. 封装

1. 概念

所谓的封装,其实就是尽可能地隐藏对象的内部实现细节,控制对象的修改及访问权限,将某些实现细节部分包装、隐藏起来,并对外提供公开的方法访问私有成员。一般我们是利用private访问修饰符来实现。

通俗地说,封装就是把一个Java类的部分实现进行“隐藏”、“包裹”,不让你完全看见它的“内部”是咋回事。就好比一个银行,有的地方(大厅)可以对外暴露,但有的地方(金库)就需要隐藏。我们在修建银行的时候,金库在设计之初就是要被隐藏的,但金库会预留一个渠道对外联通,让钱可以进出。

Java里的封装其实也是这样的。把一个类中不想让别人直接看到的内容封装隐藏起来,不让别人直接操作这部分内容,但又可以通过某种方法对外展示。这样,我们对java类的操作就可进可退,保证了类的安全性。

所以封装可以被认为是一种类的保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。如果想要访问该类的代码和数据,必须通过严格的接口控制。通过适当的封装,让程式码更容易理解与维护,也加强了代码的安全性。

2. 必要性

那么Java里的类一定都要封装吗?我们来看一个场景,如下图所示:

比如上面的Student类,内部有4个非私有的属性。我们可以在对象的外部,为这几个属性直接赋值。在上面的代码中,我们给age赋值20000,学生的年龄是20000,这合理吗?得分是1000合理吗?这就出现了非法的数据录入,存在数据的安全问题。这种问题该怎么解决?如何对属性的赋值加以控制?

针对这种情况,我们就可以使用封装!将类内部的属性进行私有化,然后再提供对外的方法调用这些属性,并在方法内部对属性的赋值进行合理控制。别的地方只能通过规定的方法来访问数据,隐藏了类的实现细节,方便修改和实现,这样我们就不担心非法数据的录入问题了!这也就是封装的意义所在!

既然封装有其存在的必要性,那么我们该如何实现封装呢?请继续往下看!

3. 实现要求

如果我们想实现类的封装,主要有以下两个步骤:

1. 给成员变量添加private修饰符;

2. 添加公开的get和set方法;

3. 在赋值和取值方法中,加入属性控制语句,对属性值的合法性进行判断。

3.1 private关键词

private是一种访问权限修饰符,是一个表示“私有的“关键词,可以修饰类、方法和变量等。如果用来修饰成员变量,可以实现成员变量的私有化,限制该成员变量只能在类的内部直接访问,类外不能直接访问。

3.2 getter和setter方法

通常情况下,这些get和set方法被称为getter和setter方法。任何访问类中私有成员变量的操作都要通过这些getter和setter方法。

get方法是用来获取私有属性的方法,其语法结构为:

public 返回值类型 getXxx(){
    
    return 返回属性值; 
} 

set方法是用来修改私有属性值的方法,其语法结构为:

public void setXxx(属性类型 属性){ 
    this.xxx = 属性;
	//其他对属性进行操作的代码
} 

这里我们要注意,get方法一般没有参数,但有返回值;set方法一般没有返回值,但有参数!!!

4. 封装案例

为了让大家更好地理解如何实现封装,我们设计一个Person类,我们来看看代码:

/**
 * 属性:姓名、年龄、性别
 * 封装步骤:(1).把成员变量变成私有的;(2).添加公开的get和set方法
 */
public class Person {

	// 私有化属性
	private String name;
	private int age;
	private String sex;

	//设置公开方法
	// 获取name
	public String getName() {
		return name;
	}

	// 对name赋值
	public void setName(String name) {
        //this关键字解决了实例变量(private String name)和局部变量(String name)之间的同名冲突。
		this.name = name;
	}

	public int getAge() {
		return this.age;
	}

	public void setAge(int age) {
		// 限制年龄的范围
		if (age > 100 || age < 1) {
			// 设置一个默认值
			this.age = 18;
		} else {
			this.age = age;
		}
	}

	public String getSex() {
		return this.sex;
	}

	public void setSex(String sex) {
		// 设置性别
		if ("男".equals(sex) || "女".equals(sex)) {
			this.sex = sex;
		} else {
			this.sex = "男";
		}
	}

    //提供无参和有参的构造方法
	public Person() {
		super();
	}
	
	public Person(String name, int age, String sex) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}

}

从上述代码中,我们可以看出实现类的封装其实也很简单:

1. 成员变量(属性)私有化(用private修饰);

2. 添加公开的get和set方法,用public修饰;

3. 添加有参和无参的若干构造方法。

一般我们把这样封装好的一个类成为Java Bean,Java Bean一般有两种:

1. 负责数据承载的Bean;

2. 负责业务逻辑的Bean。

我们上面的案例,就是一个数据承载的Bean。


三. 结语

至此,我们就把面向对象的第一个基本特征--封装 学习完了。现在你知道该如何正确地封装一个Java Bean了吗?在面试时,我们要把封装的概念及其优点讲清楚:

良好的封装能够减少耦合;

封装可以使得类内部的结构自由修改;

封装可以对成员变量进行更精确的控制;

封装隐藏了类的信息和实现细节。


往期推荐:

java 如何实现短函数调用?

在java中String类为什么要设计成final?Java面试常见问题

JAVA中的this是什么意思? —— 初学java常见问题

jdk17有可能代替 jdk8吗?-- JAVA

相关文章

哪个是用于开发 Java 应用程序的最佳操作系统?

经常引起很多争论的一个主题是,哪个是用于开发 Java 应用程序的最佳操作系统。这篇文章就这个问题给出了一种看法。经常引起很多争论的一个主题是,哪个是用于开发 Java 应用程序的最佳操作系统。这篇文...

正点原子I.MX6U嵌入式Linux C应用编程:第一章《应用编程概念》

今日头条/西瓜视频/抖音短视频 同名:正点原子原子哥感谢各位的关注和支持,你们的支持是原子哥无限前进的动力。第一章《应用编程概念》 由于本章内容较多,所以第一章《应用编程概念》将会分为几个部分进行内容...

深入解析Java工厂模式及其应用场景

Java工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳实践,这种模式提供了一种抽象工厂,通过使用工厂方法来创建对象。工厂方法将对象的创建推迟到子类中,这样就...

java高级用法之:绑定CPU的线程Thread-Affinity

简介在现代计算机系统中,可以有多个CPU,每个CPU又可以有多核。为了充分利用现代CPU的功能,JAVA中引入了多线程,不同的线程可以同时在不同CPU或者不同CPU核中运行。但是对于JAVA程序猿来说...

干货:开发一个Web应用程序(PWA)需要做的一些准备工作

自苹果推出了iPhone应用商店以来,App成为了我们生活中不可或缺的一部分,而对于实体业务也是如此,现在各行业都在推出自己的App,但有没有人想过这样一种场景,如果自己的潜在客户还没有安装你的App...

程序编码优化-JAVA篇 编写高质量代码:改善java程序的151个建议

之前一篇博客介绍了C语言中一些基础的编码优化,实际上涉及到编译优化,所有语言进行编译时,相应的编译器都可以进行对应的优化;1. 字段访问相关优化基于逃逸分析的优化方式:进行锁消除、栈上分配、标量替换等...