1.类和对象
面向对象技术,也简称OOP。前面说了,它是一个编程思想,既然是思想,它就适用于任何支持面向对象编程的语言。虽然不同的面向对象语言都有其各自的特点,但是万变还是不离其宗的。
1.什么是类?
首先了解几个概念,什么是类?这个其实很容易理解,在现实中我们常说,物以类聚、人以群分。这里的类,和我要解释的类,概念上是一样的,都是现实中一些拥有共同属性、特征的事物。就像,人类,犬类,猫类等,它们通常都是抽象的描述了,一类事物,不是具体指的指某一个,人啊,狗啊,猫啊,这样的,而是它们的统称。
定义格式:
class <类名>{
//类中的成员
}
类名的定义,使用帕斯卡命名法。类的定义是用 class关键字
2.什么是对象?
知道了类之后,对象就很容易理解了,它是由类所生成的一个具体的实例。比如人这个类,是人类的统称,而用人这个类,所生成的对象,指的是具体的某一个人,这个对象具有人这个类的一切属性,因为对象是类的具体的实例。
代码演示,如何在一个类中生成另一个类的对象:
//先定义一个类
class Person{
//类中的成员
}
class Program{
static void Main(string[] args){
Person <对象名>;//声明了类的变量,但是没有实例化
<对象名> = new Person();//调用类中空参数的构造函数,实例化
}
}
类的实例化,也就是生成类的对象,只是叫法不一样而已。类的实例化用到了new关键字,调用类的构造函数,由于我的Person类,没有写构造函数,编译器在编译的时候会为我们自动的添加一个空参数的构造函数,如果你写了,编译器,就不会加了,就用你的构造函数。
两行代码也可以简写成一行,具体看需要;
3.类和对象的关系
一个类能够生成无数的对象,而一个对象只能是一个类所生成的。一个类可以有无数个实例,但是一个示例肯定只对应生成它的一个类;
2.属性、字段和方法
这些东西,都是类中的成员,刚开始的时候,我十分的迷惑,属性这个东西,常常以为它也是变量,但是后来才清楚,它是用来维护字段的。
1.什么是字段?
字段就是用来描述类的特征的,比如说人这个类中,人都有姓名,年龄,性别等共同的特征,这些特征我们可以用字段来定义。
定义:
<权限修饰符> <静态修饰符> <字段类型> <字段名>;
在定义的时候,也可以直接的初始化。私有的字段采用驼峰命名法,共有的则是帕斯卡命名法,但绝大多数都是私有的。权限默认是私有的。静态修饰符,选择性的加入;
字段也可以被readonly关键字,所修饰。被它修饰的字段,只可以在构造函数和定义的时候初始化。
2.属性
个人认为呢,属性是字段的修改器。因为面向对象有个特性,那就是字段,要的权限,尽量要私有起来,不让随便的修改,而属性,则为我们提供了,绿色通道,可以使用它来修改字段中值。
定义:
public <返回值类型><属性名>{
set{
<字段> = value;
}
get{
return <字段>;
}
}
这是一个标准的属性定义方法。两个字段是同一个字段,这看起来有点像方法,但是它没有参数列表,这是最大的区别。并且它的权限必须是非私有的,不然就失去了,它存在的意义了;如果省略其中的一个,就变成了只读,或只写的属性了;
自动属性定义格式:
public <属性名>{set;get;}
创建自动属性,我们都不用创建要修改的字段,而是直接创建属性,就可以了,其它的编译器在编译时都会为我们完成。但是这样有一个限制,就是不能定义只读,或只写的属性;
3.方法
方法也就是我们之前讲的函数,只是叫法不一样,它是类中的成员。
3.构造函数深入
构造函数其实也是可以重载的,和普通的函数重载一样,函数名相同,参数列表不同,就可以了。构造函数的重载可以为我们提供不同的初始化类的实例的方法。另外构造函数,前面也提到了,如果没有写构造函数,编译器会为我们加,如果写了,就用你的。如果你只写了一个几个参数的构造函数,那么类在初始化的时候,就只能传入那几个固定的参数,这样会相当的有限制,所以通常情况下,我们都是写一个空参数的构造函数,和若干个带参数的构造函数;
此外还有静态的构造函数,和静态类,下面将详解
1.什么是静态的构造函数?
它和构造函数的定义就有点区别了,虽然同样都是在类中,但是它是这样定义的:
static{
//静态的构造函数代码块
}
它的作用呢,主要是初始化,类中的静态变量,它是优先于对象的,在加载类,生成对象的时候,首先会调用静态的构造函数;
2.静态类
顾名思义,使用static所修饰的类,它有一个特点,就是它里面的成员,必须都是静态的,且它不能被实例化。既然不能被实例化,那么也就是不需要构造函数,但是它可以有一个静态的构造函数。
4.静态成员
之前也讲到了,静态的成员。像静态的函数,变量啊。只是说了,它的作用,并没有解释究竟是为什么。
概念
静态是相对于动态来说的,静态也就是固定不变的意思。一旦一个类中定义了一个静态的成员,你就要想到,它和类绑定了。无论这个类生成了,多少个对象,在使用到这个类的静态成员的时候,使用的都是这个类中的这个成员。而不是哪一个单独对象中的静态成员。因为静态成员属于类,而不副属于某一个对象,只要是类所生成的对象,都可以访问到类中的静态成员;
5.面向对象的特性
面向对象拥有三个非常关键的特性:封装,继承和多态性;还有像抽象类,和接口这样重要的特性;
1.封装性
前面我在定义类中成员的标准格式中,都讲到了,权限修饰符。而权限修饰符就是封装性的最主要体现之一。封装性的意思是说,在保证程序正常运行的基础之上,尽量的减小类中成员的访问权限大小。
权限修饰符
private:权限最小(默认权限),用它定义的成员,只能在本类中被访问;
protected:只能被该类的派生类所访问,后面会讲到什么是派生类;
internal:内部权限,一个项目中的类可以访问;
public:权限最大,任何地方都可以访问,通常用在属性上;
2.继承性
继承性在面向对象中极其的重要,可以最大程度的为我们,减少重复代码。它的意思是指,一个类可以从一个类中继承它里面成员。就像儿子继承老子的遗产一样。
3.多态性
多态性是建立在继承性的基础之上的,它可以使程序更加的灵活。它的意思是说一个变量可以有多种状态,不仅可以访问它的本身,也可以访问到它的基类;
4.抽象类
抽象的意思是指含糊不清,描述一个事物,说的十分笼统。抽象类就是这样的,在现实中的一些事物,并不都是那么具体的。所以程序设计中抽象类,就显得很有必要。就比如说车这个类,它就十分的抽象,它又可以派生出汽车类,火车类啊。。,像这种十分抽象的事物,而且天生就是要被用来继承的类,称为抽象类。
特点:类中可以有抽象的成员,也可以有不抽象的。一个类继承了它之后,如果没有覆盖掉它里面抽象的成员,那么那个类,就还是抽象的。只有抽象成员全部覆盖,那个类才不算抽象;
5.接口
接口是一种协议,它为我们的程序提供一个标准。就像是USB接口一样,它是一种传输数据的协议,只要遵守我的传输协议,优盘啊,读卡器啊,手机啊都可以连接电脑。这对程序的后期维护来说意义重大,如果程序需要升级,我们就不用再删除重写代码,我们可以在原有代码的基础之上,添加拓展接口,实现无缝的程序升级。
这篇文章大多是文字性的概念性总结,大家先留个印象,下一篇更多的是代码演示。