1、面向对象的概念
1.面向过程(C)-----》面向对象
面向过程:面向的是完成这件事的过程,强调的是完成这件事的动做。
如:将东西放进冰箱
一、打开冰箱门
二、把东西放进去
三、关闭冰箱门
如上都是强调的动做ide
如:张三长的矮小,力气也小
打开冰箱门,因为矮小够不这,须要垫个凳子
力气小抬不动东西,须要找人帮忙
关闭冰箱门,依然须要垫个凳子函数
李四长的高,力气很是大 本身就能打开冰箱门 本身就能抬动 关闭冰箱门也不须要凳子
若是用面向过程的思想来解决事,当执行这件事的人不一样时,这样就须要为每一个不一样的人量身定作解决事情的方法。工具
面向对象:没有统一的理解,找个对象来作这个事情
如:把东西放进冰箱里
由于干的事情里,每件都有冰箱,这样就能够以冰箱做为对象
1.冰箱门能够被打开
2.东西能放进冰箱里
3.冰箱门能够被关闭this
张三:调用1 调用2 调用3
李四:调用2 调用2 调用3code
面向对象:意在写出一个通用的代码,屏蔽差别对象
关门
面向过程:关门
张三:一脚把门踹紧了
李四:轻轻的把门带上了
王五:门没关严内存
面向对象:关门
门能够被关闭资源
我在黑板上画了一个圆、方块、菱形
将 圆做为对象 圆能够被画在黑板上
将 方块做为对象 方块能够被画在黑板上
将 菱形做为对象 菱形能够被画在黑板上get
将 黑板做为对象 黑板上能够被画:圆、方块、菱形
找对象时,通常找的是被动的一方string
咱们在代码中描述一个对象,经过描述这个对象的属性和方法。
对象没必要须是看得见摸得着的
灯:属性和方法
属性:值
外形:长的
亮度:500W
颜色:白色
牌子:XX
发信:发光
电风扇:属性,方法
属性:三个扇叶
颜色:白色
品牌:XX
方法:转动,扇风
咱们把具备相同属性和相同方法的对象进行进一步的封装,抽象出来,类这个概念。
类就是个模子,肯定对象应该具备的属性和方法
对象时根据类建立出来的。
类至关于一个盖大楼的图纸,对象就是盖出来的大楼
2、面向对象的代码
类:
语法
public class 类名
{
字段:
属性:
方法:
}
写好类以后,咱们须要建立这个类的对象,
name,建立这个类的对象的过程称之为:实例化
使用关键字:new
this:表示当前这个类的对象
类是不占内存的,而对象时占内存的
public class Person { public string _name; public int _age; public char _gender; public void CHLSS() { Console.WriteLine("我叫{0},我今年{1}岁,我是{2}的,我能够吃喝拉撒睡~~~", this._name,this._age,this._gender); } }
调用类
static void Main(string[] args) { //建立person类的对象 Person zhangSan = new Person(); zhangSan._name = "张三"; zhangSan._age = 21; zhangSan._gender = '男'; zhangSan.CHLSS(); Console.ReadKey(); }
属性:保护字段,对字段的赋值进行赋值和取值进行限定
属性的本质就是两个方法,get()和set()
当给属性赋值的时候,首先执行set方法
当输出属性值得时候,会执行get方法
字段就是女人 属性才是真男人
字段在类中,必须是私有的。要对字段进行操做必须经过属性。
属性的代码
既有get又有set:可读可写属性
只有get:只读属性
只有set:只写属性
访问修饰符
public:公开的公共的,在哪都能访问
pribate:私有的,只能在当前类的内部进行访问,出了这个类就访问不到
public class Person { private string _name; public string Name { //当输出属性值得时候,会执行get方法 get { return _name; } //当给属性赋值的时候,首先执行set方法 set { _name = value; } } private int _age; public int Age { get { return _age; } set { if (value < 0 || value > 100) { value = 0; } _age = value; } } private char _gender; public char Gender { get { if (_gender != '男' && _gender != '女') { return _gender = '男'; } return _gender; } set { _gender = value; } } public void CHLSS() { Console.WriteLine("我叫{0},我今年{1}岁,我是{2}的,我能够吃喝拉撒睡~~~", this.Name,this.Age,this.Gender); } }
属性调用
class Program { static void Main(string[] args) { //建立person类的对象 Person zhangSan = new Person(); zhangSan.Name = "张三"; zhangSan.Age = 21; zhangSan.Gender = '男'; zhangSan.CHLSS(); Console.ReadKey(); } }
3、静态和非静态的区别(static)
一、在非静态类中,既能够有实例成员,也能够有静态成员。
二、在调用实例成员的时候,须要使用对象名.实例成员
在调用静态成员的时候,须要使用类名.静态成员
总结:静态成员必须使用类名去调用,而实例成员使用对象名调用
静态函数中,只能访问静态成员,不容许访问实例成员
实例函数中,既可使用静态成员,也可使用实例成员
静态类中只容许有静态成员,不能有实例成员
使用范围
一、若是你想要你的类当作一个“工具类”去使用,这时候能够考虑写成静态类。(常用的类)
二、静态类在整个项目中资源共享
只有在程序所有结束后,静态类才会释放资源
释放资源:释放内存 C#中有垃圾回收器GC
4、构造函数
做用:帮助咱们初始化对象(给对象的每一个属性依次的赋值)
构造函数是一个特殊的方法
一、构造函数没有返回值,连void也不能写
二、构造函数名必须跟类名同样
三、构造函数必须是public
建立对象的时候会执行构造函数
构造函数能够有重载
类当中会有一个默认的无参数的构造函数,当你写一个新的构造函数以后,不论是不是无参数的,那个默认的五参数的构造函数都会被干掉
关键字:new
new帮助咱们作了三件事
一、在内存中开辟一块空间
二、在开辟的空间中建立对象
三、调用对象的构造函数进行初始化对象
关键字:this
一、表明当前类的对象
二、在类当中显示的调用本类的构造函数
5、析构函数
当程序结束的时候,析构函数才会执行
做用:帮助咱们释放资源
GC有时候不会立刻释放资源,这时候使用析构函数来立刻释放资源。
最后的总结练习
class Ticket { /*写一个Ticket类,有一个举例属性(本属性只读,在构造方法中赋值,不能为负数) 有一个价格属性,价格属性只读,而且根据举例distance计算价格Price(1元/千米) 0-100千米 不打折 101-200千米 打9.5折 201-300千米 打9折 300千米以上 打8折 有一个方法,能够显示这张票的信息,90千米90块钱 */ private double _distance; public double Distance { get { return _distance; } } public Ticket(double distance) { if (_distance < 0) { _distance = 0; } this._distance = distance; } private double _price; public double Price { get { if (_distance > 0 && _distance <= 100) { return _distance * 1.0; } else if (_distance > 100 && _distance <= 200) { return _distance * 0.95; } else if (_distance > 200 && _distance <= 300) { return _distance * 0.9; } else { return _distance * 0.8; } } } public void Show() { Console.WriteLine("{0}千米{1}元钱", _distance, Price); } } 调用 static void Main(string[] args) { Ticket t = new Ticket(150); t.Show(); Console.ReadKey(); } }