面向对象的4要素:抽象,封装,继承,多态

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010087886/article/details/49534245

在平时说到面向对象的特性的时候,一般的答案有几种。

如果是面向对象的3大基本特征:①抽象,继承,多态 封装,继承,多态

如果是4特征:抽象,封装,继承,多态

 

可见抽象与封装这两个概念其实联系是很紧密的。

而我确实想要搞清楚具体的含义,今天进行一个总结。

 

参考书目:《代码大全 2th》《C++ Primer 5th》以及网上的一些资料。

其中关于抽象与封装,以代码大全为主要参考。

关于多态以C++ Primer为主要参考。

其中我引用原文的地方都会首先标出,我开始自己总结时又会空一行开始。

内容为:抽象与封装,C++的多态。

 

1.抽象与封装

主要参考的是代码大全5,6两章。

5.3节---形成一致抽象

原文:抽象是一种能让你在关注某一概念的同时可以放心地忽略其中一些细节的能力——在不同的层次处理不同的细节。

5.3节---封装实现细节

原文:封装填补了抽象留下的空白。

6.1节---抽象数据类型

原文:抽象数据类型(ADT)是指一些数据以及对这些数据所进行的操作的集合。

6.2节---良好的封装

原文:封装是一个比抽象更强的概念。抽象通过提供一个可以让你忽略实现细节的模型来管理复杂度,而封装则强制阻止你看到细节。

这两个概念之所以相关,是因为没有封装时,抽象往往很容易被打破。

 

书中一个准则是,当我们在操作数据的时候,不应该用对象直接对数据进行访问,我们应该使用与数据对应的那些操作去操纵数据。
而这些操作(子程序)如果对于外部可见,就是类的公开接口。
而公开接口就是一种抽象,它避免了我们在数据结构的低层次上操纵数据。

因此,我的理解是

我们在定义一个类的时候,设计了类的数据成员(private),方法,并规定了哪些方法public,哪些方法private。

这个过程本身既包括了抽象,也包括了封装。
如果一定要进行一个划分,那么

抽象:将数据,方法整合到一个类里面,并且希望使用者只使用方法去操作数据成员,而且希望哪些方法应该被类使用者调用。

封装:然后在此基础上,物理上规定哪些成员为public,哪些成员为private。

 

所以作者说的,让我们在不同层次上处理细节。我的理解是:
假如说有一个聚会人员名单,你使用一个queue来保存每一个报名者,那么你对人员的增删就需要对于这个queue来操作。这是具体的数据结构层次。
如果你抽象为ADT,那么使用者就对聚会人员这个对象直接add(某人),或者delete(某人)这样的操作,使用者也不知道是用vector,还是queue,还是stack来存的。


作者说的,封装填补了抽象留下的空白。我的理解是:
封装保证了抽象想要达到的目的的实现。因为封装在抽象的基础上,规定了public,private。这样强制规定了可见性。这就是填补了空白的意思。

 

2.多态

C++的多态广义上来说有:静态多态性,动态多态性。

静态多态性通常称为编译时多态,通过函数重载来实现。

动态多态性通常称为运行时多态,通过虚函数来实现。

在面向对象的范畴来说的多态特征,是指动态多态性。这个特性在C++ Primer 5th中被直接描述为动态绑定(dynamic binding)或者运行时绑定(run-time binding)。

 

15.3节---虚函数

原文:引用或指针的静态类型与动态类型不同这一事实正是C++语言支持多态性的根本所在。

通过对象进行的函数调用将在编译时绑定到该对象所属类的函数版本上。

当且仅当对通过指针或者引用调用虚函数时,才会在运行时解析该调用,也只有在这种情况下对象的动态类型才有可能与静态类型不同。

 

15章术语表

原文:动态类型(dynamic type)对象在运行时的类型。引用所引用对象或者指针所指对象的动态类型可能与该引用或指针的静态类型不同。

基类的指针或引用可以指向一个派生类对象。

在这样的情况下,静态类型是基类的引用(或指针),而动态类型是派生类的引用(或指针)。

动态绑定(dynamic binding)直到运行时才确定到底执行函数的哪个版本。

在C++语言中,动态绑定的意思是在运行时根据引用或指针所绑定对象的实际类型来选择执行虚函数的某一个版本。

 

集合术语来看,书中讲的已经非常明白了。因为本身在继承的基础上就存在静态与动态类型2种类型。

动态绑定的两个必要条件就是:

①基类中必须使用虚函数或纯虚函数。

②调用函数时要使用基类的指针或者引用。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的大特性是抽象封装继承多态。其中,抽象类和接口是实现抽象的两种方式,而封装则是将数据和方法包装在一起,以保护数据不被外部直接访问和修改。继承则是通过子类继承父类的属性和方法,实现代码的复用和扩展。多态则是同一种行为具有多种不同表现形式或形态的能力。 具体来说,抽象类是一种不能被实例化的类,其中可以包含抽象方法和非抽象方法。抽象方法没有具体的实现,需要在子类中被实现。而非抽象方法则有具体的实现,可以被子类继承和重写。抽象类可以作为其他类的父类,子类需要实现其中的抽象方法才能被实例化。 封装则是将数据和方法包装在一起,以保护数据不被外部直接访问和修改。Java中可以使用private、protected和public三种访问修饰符来实现封装。private修饰的属性和方法只能在类内部访问,protected修饰的属性和方法可以在类内部和子类中访问,而public修饰的属性和方法可以在任何地方访问。 继承则是通过子类继承父类的属性和方法,实现代码的复用和扩展。Java中使用extends关键字来实现继承。子类可以继承父类的public和protected属性和方法,但不能继承private属性和方法。子类可以重写父类的方法,也可以使用super关键字调用父类的方法。 多态则是同一种行为具有多种不同表现形式或形态的能力。Java中通过继承和接口实现多态。具体来说,子类可以重写父类的方法,实现不同的行为表现形式。而接口则可以让不同的类实现相同的方法,实现不同的行为表现形式。 下面是一个简单的Java代码示例,演示了抽象封装继承多态的使用: ```java // 抽象类 abstract class Animal { // 封装 private String name; public Animal(String name) { this.name = name; } // 抽象方法 public abstract void makeSound(); // 非抽象方法 public void eat() { System.out.println(name + " is eating."); } } // 继承 class Dog extends Animal { public Dog(String name) { super(name); } // 重写父类方法 @Override public void makeSound() { System.out.println("Woof!"); } } // 多态 class AnimalSound { public static void makeSound(Animal animal) { animal.makeSound(); } } public class Main { public static void main(String[] args) { // 多态 Animal dog = new Dog("Buddy"); dog.makeSound(); // 输出:Woof! dog.eat(); // 输出:Buddy is eating. // 多态 AnimalSound.makeSound(dog); // 输出:Woof! } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值