[Java]初学Java之OOP三大特性封装、继承、多态
Intro
前前后后忙了三个多月,总算闲了下来能学学Java了。
花了大概一周时间把JavaSE的内容过了一遍。因为之前有C++、数据结构等基础,也有在京东的开发经验,看这些入门内容是极轻松的~
随着Coding经历的不断累积,愈发觉得把脑中所想变为有条理的文字是很有必要的,于是决定用博客将所学的内容记录、整理下来。
一是深化学习印象,二来留待日后翻看或改进。私心也觉得把学过的技术整理成文是一件很geek的事情。
如标题一样,这篇文章主要集中在Java的封装、继承、多态的内容上。
除了基本的定义,本文也尝试回答以下问题:
- XX是什么
- XX从何而来
- XX出现是为了解决什么问题
- XX是自上而下推导的,还是自下而上抽象的(实现的过程)
- XX为何有效
- XX是历史必然出现的选择吗,为什么
- XX如何实现
正文
封装(Encapsulation)
简单来说,封装就是将程序包装起来,隐藏内部细节(属性、方法等),不允许外部干涉,同时只暴露少量接口供外部调用。
打个比方,我们玩NS时,操作的手柄就是封装好的。
一般人并不知道也并不需要知道手柄内部具体是怎么工作的,只需要跟着引导操作暴露在手柄表面的按键/扳机就可以玩游戏了
简单的具体实现如下,将部分属性、方法用private前缀修饰,同时提供public方法让外部可以调用
public class Capsule {
//私有属性,外部不能访问
private String name;
private int id;
//提供可以操作内部属性的方法
//get获取
public String getName(){
return this.name;
}
//set设置
public void setName(String name){
this.name = name;
}
}
了解了封装的基本内容后,我们就可以尝试对七个问题做出解答了
-
封装是指将数据和方法打包在一个类中,然后限制外部对数据的直接访问,只允许公共接口操作数据
-
封装思想发源于模块化编程和抽象数据类的思想,在OOP(面向对象编程)的发展中变得更为突出
-
封装的出现增强了代码的安全性和可维护性,对于我们来说则让我们可以修改相关方法,而不必修改调用该方法的程序片段
-
封装是自下而上抽象的,具体来说是将一个个数据方法定义好放入类中,通过隐藏细节和提供公共接口,实现模块化、抽象和高内聚的目标。简单来说就是将一众小个体聚合成抽象的大个体
-
首先封装是模块化编程的一个具体体现,其次封装思想让封装类的开发者专注于内部细节,而让外部调用的开发者简单易懂
-
是,因为随着现代项目体型愈发庞大,分工协作也愈发详细,为了让协作者能快速使用其他开发者写的代码,模块化编程、封装就是必不可少的。
-
见上述代码实现~
继承(Inheritance)
继承是OOP的基石,它允许创建分层级的类
更具体来说,就是子类可以继承父类的特征行为
举个真实世界的例子,牛牛和兔兔(子类)都是食草动物(父类),所以它们都继承父类“食草”的特征。
另外,Java不支持多继承,但支持多重继承,也可以不同类继承自同一个类。
用人话说就是Java中一个儿子不能有多个爸爸,一个爸爸可以有多个儿子,然后也可以有爷爷、爸爸、儿子这样的继承结构
简单的东西讲完,可以试着回答那七个问题了
-
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
-
继承的概念源自多个领域,包括生物学、OOP编程等
-
继承的出现解决了代码的重复,增强了可维护性(将两个类相同代码提取成父类)
-
继承是自上而下推导的,从一个通用类派生出多个具体类。详细来说是从父类/超类派生出多个子类
-
继承让代码可复用,提高了可维护性
-
是,在开发过程中,多个代码或多或少具有相同特征,这时候就必然要抽出一个通用类以保证代码的可维护性。继承因而存在
动物父类:
public class Animal {
private String name;
private int id;
//有参构造
public Animal(String myName, int myId) {
name = myName;
id = myId;
}
public void eat(){
System.out.println(name + "eating");
}
public void sleep(){
System.out.println(name + "sleeping");
}
public void intro(){
System.out.println("Hi! I No. is" + id);
}
}
猫猫子类:
public class Cat extends Animal {
//子类构造函数
public Cat(String catName, int catId) {
//将收到的参数传入父类构造函数中
//super是调用父类的关键字
super(catName, catId);
}
}
多态(polymorphic)
多态,顾名思义就是可以有多种状态。
这个“多种状态”仅限于方法,属性是没有多态的
对一个对象来说,实际类型是确定的,指向的引用类型可以不确定。
这个用代码展现比较直观,我们举例猫猫Cat是动物Animal的子类,继承了Animal:
Cat cat1 = new Cat();
Animal cat2 = new Cat();
Object cat3 = new Cat();
//等号左边就是引用类型,等号右边有new的就是实际类型
//因为Animal和Cat是父子关系,因此可以用Animal指向Cat; Object是所有类的祖宗类,因此也可以指向Cat
下面是错误写法:
String cat3 = new Cat();
//String与猫猫没有任何关系
看到这里,我当时就很迷惑哇,这些个不确定的引用类型之间有什么区别?
从方法来说,引用类型决定了你的对象可以调用什么方法。
这个理解来就是引用类型如果是自己(子类),那么可以就按照子类的方法正常调用,也能调用父类方法,因为子类继承了父类的方法。
如果引用类型是上一层(父类),那么就无法调取子类方法,只能在自己这层和往上一层调用。
那肯定有人疑惑"我为老不尊偏要抢小孩东西用,那怎么办"
那也不是不行,可以自降身份,你也是小孩那抢小孩东西就不算为老不尊啦(发癫
下面代码childfunction是假定的子类方法
//为老不尊错误示范:
cat2.childfunction();
//正确示范:
((Cat) Cat2).childfunction(); //像其他属性一样用了强制转换,从Animal变成了Cat
那么现在我们尝试回答多态的七问
-
多态是同一个行为具有多个不同表现形式或形态的能力
多态就是同一个接口,使用不同的实例而执行不同操作 -
多态一词最早源于数学领域。在后续计算机的发展中,为了能编写更灵活通用的代码而引入了多态概念,并最后成为OOP的核心之一
-
多态的出现使得开发人员不再需要为每种类型编写特定的代码,能够编写通用代码处理不同类型的对象
-
多态是自上而下的推导。从更一般、通用的类或者接口向更具体的子类推导
-
消除了类型之间的耦合关系,并且让代码更加简化、灵活
-
是,为了在大型系统中减少重复代码的编写,多态必然是会出现的
-
见上
Ending
写到这里就差不多结束了。
作为入门,我相信对于这三个OOP的核心特性,我是学得相当粗浅的,其中肯定有遗漏、不足的地方,比如方法的重写(Override)和类型转换等这些跟这三大特性相关的内容我一点也没有涉及。因为我感觉我现在也没太学明白
留待日后不断学习实践后,再发一篇来查漏补缺吧w
感觉写这类文章比想象中累多了hhhh
但挺好的,有输入,也得有输出!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构