前言
面向对象对于程序员来讲是一个很重要的概念,不了解面向对象的理论知识,在学习面向对象的语言时就会产生困惑
1,面向对象含义
- 起源:
- 早期程序设计都是面向过程,而随着时间的发展问题的复杂度也逐渐提升。这样对于使用面向过程的设计变得越来越复杂
- 而面向对象在这一时刻从天而降,带来了全新的解决问题的方案,并逐渐发展为主流
- 对比:
古时候,文章不多的时候,印刷时固定刻板就可以了,而随着文章逐渐增多,每次都重新刻板就很麻烦了,这个时候活字印刷就出来了
面向对象和面向过程的区别类似于此:
面向对象解决问题更加灵活简单,采用封装的技术方法就可以一次编程、多次调用,并且使用属性这样的方式,降低了耦合性,可以更简单的去利用,去理解
2,面向对象的特点
封装:
封装就是将一系列程序逻辑打包成为一个类,仅仅对外展示这个类的属性,使用时无需关注其任何的内部结构,直接使用对外接口即可:
继承:
继承很容易理解,父亲的DNA传给儿子就是一种继承。在面向对象的编程中,被继承的类称为父类或基类,而继承的类称为子类或派生类。继承需要遵循一定的规则:
在OOP(面向对象编程)中,可以使用类名后面加冒号加被继承的类的方法实现继承
继承规则:
- c++ 可以实现多继承,而像c#则只支持单继承,要实现多继承,则需要通过接口来实现
- 静态类不能被继承。因为静态类中只包含静态方法和静态属性,不能被实例化,
多态:
多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。
多态的几种实现方式:
- 虚函数
- 抽象类
- 重载
- 覆盖
- 模板(重载和多态无关)
3,类的特点
面向对象一个重要的概念就是类,对于类的深入理解可以更好的学习了解面向对象的概念(本博客关于类的概念基于C#)
3.1、类的区分
静态类与实例类:
静态类使用修饰符static
来修饰,静态类内的属性方法都为必须为静态成员,创建一个静态类可以理解为创建一个直接实例化的类,但是个别细节与实例化不同
而未使用static
修饰的则为实例类,实例类里面的函数定义没有要求,可以定义为静态成员或实例成员
而使用static
修饰创建类内的属性或方法被称为静态成员,静态成员属于类,在调用时,直接通过 类名.静态成员 的方式调用
关于静态成员特点:
- 当类第一次被访问的时候,就会将这个类下面的所有的静态成员创建在内存当中
- 静态成员既不在栈也不在堆中。创建在静态存储区
- 静态成员只创建一次,在类第一次被访问的时候创建
- 静态成员被创建在静态存储区后,直到程序结束后才会被回收
而没有使用static修时的属性方法为实例成员,实例成员属于对象,需要通过实例化后再访问。
通过代码来理解静态成员与实例成员以及访问方式:
class Program
{
static void Main(string[] args)
{
Exam exam=new Exam{
};
Console.WriteLine(exam.i); //实例成员需要先实例化再访问
Console.WriteLine(Exam.j); //静态成员直接通过类名访问
}
}
public class Exam //实例
{
public int i=1;
public static int j=2;
}
抽象类:
抽象类的特点很简单,就是只能作为基类被其他类继承,而不能实例化
可以使用abstract
来修饰抽象类,抽象类和静态类不同。抽象类里可以包含两种抽象成员,分别是抽象方法声明和抽象属性,同时也可以包含其他非抽象成员,具体的使用方式为:
public abstract class Abst //抽象类
{
public int i=1;
public abstract void print(); //定义一个抽象成员
}
public class Demo:Abst //继承该抽象类
{
public override void print() //抽象成员要重写,用修饰符override
{
Console.WriteLine("yes ok!");
}
}
class Program
{
static void Main(string[] args)
{
Demo demo=new Demo{
};
Console.WriteLine(demo.i);
demo.print();
}
}
未完待续--------