[Java]初学Java之OOP三大特性封装、继承、多态

Intro

前前后后忙了三个多月,总算闲了下来能学学Java了。
花了大概一周时间把JavaSE的内容过了一遍。因为之前有C++、数据结构等基础,也有在京东的开发经验,看这些入门内容是极轻松的~
随着Coding经历的不断累积,愈发觉得把脑中所想变为有条理的文字是很有必要的,于是决定用博客将所学的内容记录、整理下来。
一是深化学习印象,二来留待日后翻看或改进。私心也觉得把学过的技术整理成文是一件很geek的事情。

如标题一样,这篇文章主要集中在Java的封装、继承、多态的内容上。
除了基本的定义,本文也尝试回答以下问题:

  1. XX是什么
  2. XX从何而来
  3. XX出现是为了解决什么问题
  4. XX是自上而下推导的,还是自下而上抽象的(实现的过程)
  5. XX为何有效
  6. XX是历史必然出现的选择吗,为什么
  7. 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;
    }
}

了解了封装的基本内容后,我们就可以尝试对七个问题做出解答了

  1. 封装是指将数据和方法打包在一个类中,然后限制外部对数据的直接访问,只允许公共接口操作数据

  2. 封装思想发源于模块化编程和抽象数据类的思想,在OOP(面向对象编程)的发展中变得更为突出

  3. 封装的出现增强了代码的安全性可维护性,对于我们来说则让我们可以修改相关方法,而不必修改调用该方法的程序片段

  4. 封装是自下而上抽象的,具体来说是将一个个数据方法定义好放入类中,通过隐藏细节和提供公共接口,实现模块化、抽象和高内聚的目标。简单来说就是将一众小个体聚合成抽象的大个体

  5. 首先封装是模块化编程的一个具体体现,其次封装思想让封装类的开发者专注于内部细节,而让外部调用的开发者简单易懂

  6. 是,因为随着现代项目体型愈发庞大,分工协作也愈发详细,为了让协作者能快速使用其他开发者写的代码,模块化编程、封装就是必不可少的。

  7. 见上述代码实现~


继承(Inheritance)

继承是OOP的基石,它允许创建分层级的类
更具体来说,就是子类可以继承父类的特征行为
举个真实世界的例子,牛牛和兔兔(子类)都是食草动物(父类),所以它们都继承父类“食草”的特征。

另外,Java不支持多继承,但支持多重继承,也可以不同类继承自同一个类。
用人话说就是Java中一个儿子不能有多个爸爸,一个爸爸可以有多个儿子,然后也可以有爷爷、爸爸、儿子这样的继承结构

简单的东西讲完,可以试着回答那七个问题了

  1. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

  2. 继承的概念源自多个领域,包括生物学、OOP编程等

  3. 继承的出现解决了代码的重复,增强了可维护性(将两个类相同代码提取成父类)

  4. 继承是自上而下推导的,从一个通用类派生出多个具体类。详细来说是从父类/超类派生出多个子类

  5. 继承让代码可复用,提高了可维护性

  6. 是,在开发过程中,多个代码或多或少具有相同特征,这时候就必然要抽出一个通用类以保证代码的可维护性。继承因而存在

动物父类:

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

那么现在我们尝试回答多态的七问

  1. 多态是同一个行为具有多个不同表现形式或形态的能力
    多态就是同一个接口,使用不同的实例而执行不同操作

  2. 多态一词最早源于数学领域。在后续计算机的发展中,为了能编写更灵活通用的代码而引入了多态概念,并最后成为OOP的核心之一

  3. 多态的出现使得开发人员不再需要为每种类型编写特定的代码,能够编写通用代码处理不同类型的对象

  4. 多态是自上而下的推导。从更一般、通用的类或者接口向更具体的子类推导

  5. 消除了类型之间的耦合关系,并且让代码更加简化、灵活

  6. 是,为了在大型系统中减少重复代码的编写,多态必然是会出现的

  7. 见上


Ending

写到这里就差不多结束了。
作为入门,我相信对于这三个OOP的核心特性,我是学得相当粗浅的,其中肯定有遗漏、不足的地方,比如方法的重写(Override)和类型转换等这些跟这三大特性相关的内容我一点也没有涉及。因为我感觉我现在也没太学明白
留待日后不断学习实践后,再发一篇来查漏补缺吧w
感觉写这类文章比想象中累多了hhhh
但挺好的,有输入,也得有输出!

posted @   ZoeXxx  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示