类和对象
说到面向对象,怎么能不知道类和对象的区别呢?说实话,我以前一直没有理解“对象”的真正含义,不知道大家有没有对“对象”有误解。
1.类:类是对一组具有相同属性的对象的抽象集合。类是不占内存的。
2.对象:世间万物皆对象,对象是一个特指的,具体的,看得见摸得着的事物。对象是占内存的。
举个栗子:电脑是一个类,而 XXX 的电脑才是一个对象;粉笔是一个类,而手里拿的这一根才是一个具体的对象。
类和结构体
类 | 结构体 | |
---|---|---|
类型 | 引用类型 | 值类型 |
内存分配 | 分配在内存的堆上 | 分配在内存的栈上 |
传递方式 | 引用传递 | 复制传递 |
类的组成
一个类中包括:字段、属性、方法。
1.字段:类似于类中声明的变量,如果它被声明为 public ,在类的外面既可以对它赋值,又可以取值。
2.属性:属性来自于字段,属性中有 get 和 set 方法,它可以对读写进行限制。
3.方法:也可以说是类的行为,为了完成具体的一项功能而封装起来的代码块。
★字段和属性的区别
1.字段如果声明为 public ,那么外部既可以对它读,又可以对它写,毫无安全性而言。
2.而属性就是为了保护字段而创造的,属性可以对读写操作进行限制,可以分为:读写、只读、只写。如果属性中 get 和 set 都有,那么就可以读写;如果只有 set ,那么就是只读;如果只有 get ,那么就是只写。
我认为类的封装最好的体现就是这儿了。允许外部访问的变量一定要声明为属性。
//字段
private int _age;
//属性
public int Age
{
set
{
//if (value >= 0 && value <= 150)
//{
// _age = value;
//}
//else
//{
// _age = 18;
//}
_age = value;
}
get
{
if (_age >= 0 && _age<=150)
{
return _age;
}
else
{
return 18;
}
}
}
★访问修饰符
访问修饰符 | 访问限制 |
---|---|
public | 完全公开,没有访问限制 |
private | 私有成员,只有在类的内部才可以访问。字段的默认修饰符 |
protected | 保护成员,该类的内部和和继承类中可以访问 |
internal | 当前程序集可以访问,类的默认修饰符为internal |
构造函数
1.为什么要用构造函数?
1)对属性的赋值方便,不用再重复的书写对象名了
2)让属性变为只读的,安全
3)如果我们有的属性不允许用户随意改动,那么我们一般把这个属性定义为只读类型,声明为只读类型就不能在对象实例化后对它进行赋值了,这个时候就可以用到构造函数对它进行初始化了。
2.语法
public Person(string name,char gender,int age)
{
this._name = name;
this._gender = gender;
this._age = age;
}
3.注意
1)定义一个类时,如果没有声明构造函数,那么它就有一个默认的无参构造函数
2)一旦我们写了构造函数,那么类中的默认的无参构造函数就消失了
3)如果我们还想要无参构造,那么就要自己重新写一个无参构造函数,我们可以写多个构造函数,这叫做重载
析构函数
~Person()
{
Console.WriteLine("在程序运行完由程序自动调用");
}
注意:1.不能在结构中定义析构函数,只能对类使用析构函数。
2.一个类只能有一个析构函数
3.无法重载和继承析构函数
4.无法调用析构函数,他是在程序执行完自动被调用的
5.析构函数既没有修饰符,也没有参数
怎么使用别的命名空间的类
1.先引用别的命名空间
2.①然后再 using ,然后直接使用类名就可以
using _04构造方法练习;
namespace _05命名空间
{
class Program
{
static void Main(string[] args)
{
Person per = new Person("小兰", '女');
per.Say();
Console.ReadKey();
}
}
}
②写全称:命名空间.类名
namespace _05命名空间
{
class Program
{
static void Main(string[] args)
{
_04构造方法练习.Person per = new _04构造方法练习.Person("小兰", '女');
per.Say();
Console.ReadKey();
}
}
}