面向对象基础
1.面向对象的概念
概念:
面向对象是指将所有需要处理的现实问题抽象为类,并通过类的实例(对象)去处理它。例如:面向对象其实就是给了我们一扇门,我们每个人关门的动作不一样,但是,在面向对象中,我们不需要去了解怎样去关门,我们只需要知道门会关闭就行了。
2.类的基本操作
- 在面向对象中,一般用类来描述某种事物的特征,用类的实例(称为对象)来创建具体的实体。例如,一个单位员工就是类,而单位中的张三,李四都是员工的对象。
- 类是封装数据的基本单位。一般用类来定义对象具有的特征(字段、属性等)和可执行的操作(方法、事件等)。
- 方法、属性和事件是构成类的主要成员。
语法:
[访问修饰符] class 类名
{
类成员;
}
类的成员:常量、字段、属性、索引、方法、事件、运算符、构造函数、析构函数和嵌套类。
例如:
public class Person
{
//字段
public string _name;
public int _age;
public char _gender;
//方法
public static void CHLSS()
{
Console.WriteLine("吃喝拉撒睡");
}
}
访问修饰符:
- public:公开的,所有人都可以访问。
- private:私密的,只能在当前类的内部进行访问,除了这个类就访问不到了。
引用:在main函数中书写
语法:类名 对象名 = new 类名()
例如:
Person SunQuan = new Person();
SunQuan._name = "孙权";
SunQuan._age = 23;
SunQuan._gender = '男';
SunQuan.CHLSS();
注意:类是不占内存的,而对象是占内存的。
3.属性
属性的作用:
保护字段,对字段的赋值和取值进行限定。
属性的本质:
就是通过两个方法对字段进行限制和保护,一个是get(),另一个是set().
public class Person
{
string _name;//定义个私有的字段,外部不能对_name直接进行读写,但可以通过其属性进行。
public string Name //数据类型必须和相应字段相同
{
//当输出属性的值的时候,会执行get()方法
get { return _name;}
//当给属性赋值的时候,首先会执行set()方法
set { _name = value;}
}
int _age;
public int Age
{
get { return _age;}
set { _age = value;}
}
对字段进行限制:
public class Person
{
char _gender;
public string Gender
{
//对输出的数据进行判断
get {
if(_gender != '男' && _gender != '女')
{
return _gender = '男';
}
return _gender;}
set { _gender = value;}
}
int _age;
public int Age
{
get { return _age;}
//对输入的数据进行判断
set {
if(value < 1 && value > 100)
{
value = 0;
}
_age = value;}
}
注意:get() 和 set()两个方法写其一就行,本代码只是为了展示其用法。 当封装数据时,可能希望配置一个只读属性。为此,可以忽略set块;类似,如果想拥有一个只读属性,就忽略get块。
4.静态和不静态的区别
概念:
拥有static的就是静态的,没有static就是不静态的。
非静态的:
1.在非静态类中,既可以有实例成员(非静态的),也可以有静态成员。
2.在非静态函数中,既可以使用静态成员,也可以使用实例成员。
3.在调用实例成员时,需要使用:对象名.实例成员。
4.在调用静态成员时,需要使用:类名.静态成员。
静态的:
1.静态类中只允许有静态成员,不允许出现实例成员。
2.静态方法中,只能访问静态成员,不允许访问实例成员。
注意:静态成员必须使用类名去调用,而实例成员使用对象名调用。
在什么情况下去使用静态还是非静态:
1.如果你想要你的类当成一个“工具类”去使用,这个时候可以考虑将类写成静态的。
2.静态类在整个项目中资源共享。
注意:只有在程序全部结束之后,静态类才会被释放。
5.构造函数
用途:
构造方法用来创建对象,并且可以在构造函数中对对象进行初始化。
注意:
1.构造函数没有返回值,连void也不能写,语法:public 类名{}。
2.构造函数的名称必须和类名一样。
3.构造函数是可以重载的。
4.构造函数可以有参数的,new对象的时候传递方法参数即可。
5.如果不指定构造函数,则类中有一个默认的无参构造函数。
6.如果指定了构造函数,则不再有默认的无参构造函数,如果需要无参构造函数,则需要自己来写。
public class PhoneNumberInfo
{
//构造函数
public PhoneNumberInfo(long phone,long password)
{
this._phone = phone;
this._password = password;
}
long _phone;//电话号码
long _password;//密码
}
6.this关键字
this的两个作用:
1.代表当前类的对象。
2.在类中显示调用本类的构造函数。
例如:
public class PhoneNumberInfo
{
public PhoneNumberInfo(long phone,long password)
{
this._phone = phone;
this._password = password;
}
//this的第二种用法:利用构造函数重载,来调用上一个构造函数。
public PhoneNumberInfo(long phone):this(phone,所输入的密码)
{
}
long _phone;//电话号码
long _password;//密码
double _yue;//余额
public double Yue
{
get { return _yue; }
set { _yue = value; }
}
double _liuliang;//流量
public double LiuLiang
{
get { return _liuliang; }
set { _liuliang = value; }
}
double _hour;//通话时长
public double Hour
{
get { return _hour; }
set { _hour = value; }
}
int _number;//短信数
public int Number
{
get { return _number; }
set { _number = value; }
}
public void Information()
{
Console.WriteLine("电话为{0}的用户,您的余额还剩{1}元,流量还剩{2}G,通话时长为{3}分钟,短信数{4}件", _phone, this.Yue, this.LiuLiang, this.Hour, this.Number);
}
}
7.析构函数
概念:
析构函数于构造函数相对应,构造函数是对象创建的时候自动调用的,而析构函数就是对象在销毁的时候自动调用的的
作用:
当程序结束时,析构函数才会执行。主要的作用就是帮助我们来释放资源。在C#中,有一个GC机制,如果我们想要马上去释放资源,我们就可以用析构函数来进行释放。
~方法名()
{
语句块;
}
注意:
- 不能在结构中定义析构函数,只能对类使用析构函数。
- 一个类只能有一个析构函数,无法继承或重载析构函数。
- 无法调用析构函数,它们是被自动调用的。
- 析构函数既没有修饰符,也没有参数。
- 析构函数的方法名必须与所在类的类名一样。