【设计思想】面向对象
Nemo& 人气:0
# 面向对象
## 概念(重点必考)
- **对象:**
对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。
- **对象的状态和行为:**
对象具有**状态**,一个对象用数据值来描述它的状态。
对象还有**操作**,用于改变对象的状态,对象及其操作就是对象的行为。
对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中。
- **类:**
具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。
类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。
类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。
- **类的结构:**
在客观世界中有若干类,这些类之间有一定的结构关系。通常有两种主要的结构关系,即 **一般——具体结构关系**、**整体——部分结构关系**。
- **一般——具体结构:**又称为**分类结构**,也可以说是“或”关系,或者是“is a”关系。
> **例如:**
一般——具体
人——黄种人
- **整体——部分结构:**又称为**组装结构**,它们之间的关系是一种“与”关系,或者是“has a”关系。
> **例如:**
整体——部分
人——身体
- **消息和方法**:
- **消息:**对象之间进行通信的结构叫做**消息**。
在对象的操作中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。
发送一条消息至少要包括说明接受消息的对象名、发送给该对象的消息名(即对象名、方法名)。
一般还要对参数加以说明,参数可以是认识该消息的对象所知道的变量名,或者是所有对象都知道的全局变量名。
- **方法:**类中操作的实现过程叫做**方法**,一个方法有方法名、返回值、参数、方法体。
## 三大特性
### 封装
**封装:**也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
> **理解:**封装其实就相当于把程序打包起来,用一个盒子装着不让外界看到。
你想想,如果自己的源码被别有用心的人看到,这是多么可怕的一件事啊!!他们可以从中找出漏洞,从而攻击你这个程序。
封装是面向对象的特征之一,是对象和类概念的主要特性。简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。
在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
### 继承
**继承:**是指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。
> **理解:**继承的过程,就是从一般到特殊的过程。
就相当于把父类的能力继承给了子类,这就是我们说的老鼠的儿子会打洞。(以免编程的时候,写两遍重复的东西)
>> **例如:**
父类:鸟(会飞)
子类:麻雀
那么麻雀可以继承鸟飞翔的能力。
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。
要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。
继承概念的实现方式有二类:**实现继承**与**接口继承**。
- **实现继承:**是指直接使用基类的属性和方法而无需额外编码的能力;
- **接口继承:**是指仅使用属性和方法的名称、但是子类必须提供实现的能力;
### 多态
**多态:**就是指一个类的相同方法在不同情形有不同表现形式。
> **例如:**
父类:人——会说话
子类:中国人——会说话(中文)
子类:美国人——会说话(英文)
多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
**例如:**
```
public class Human {
public void sayHi() {
System.out.println("~~~~");
}
}
public class Chinese extends Human {
public void sayHi(){
System.out.println("我是中国人,你好!");
}
}
public class American extends Human {
public void sayHi(){
System.out.println("I'm American. Hello!");
}
}
public class Main {
public static void main(String[] args) {
Human human = new Chinese(); //向上转型
human.sayHi();
human = new American();
human.sayHi();
}
}
```
**程序运行结果:**
```
我是中国人,你好!
I'm American. Hello!
```
# 面向对象举例
> **PS:**作为一个看动漫的死肥宅。。我就拿动漫举例吧。
京都动画自《轻音》以来几乎所有动画角色都用**同一张脸**。
![](https://img2020.cnblogs.com/blog/1542615/202003/1542615-20200307171220624-1145605546.png)
比如,《玉子市场》的北百川玉子的人设就**“继承”**了京都脸,再加入发型和瞳色等个性化元素,这就是**类继承**。
如图中间那个**光头**就是**父类**,**北百川玉子**就是**子类**,同时搬上屏幕后可以演绎剧本就是实例化的对象。
冰菓中的千反田爱瑠也**继承**了这张京都脸,所以
- **父类:**光头
- **子类:**玉子、千反田
如果剧情需要想让**玉子COSPLAY千反田爱瑠**,那就可以同时**继承玉子类和千反田类**,变成一个**玉子千反田类**,同时具备了两者特性,千反田得到了玉子的发型,这就是**多重继承**。
而每个角色都有符合各自的性格特征的设定,同样的剧情也可以有不同的演绎方式,就算不符合本身性格特征行为有时也可以表现出反差萌,这就体现了**多态性**。
加载全部内容