面向对象
1 类
1.1、类的概念:类是一个模板,确定了一个对象应该有的属性与方法,简单理解就是属性相当于一个人的特征,而方法相当于一个人的行为,在资源管理器中添加新类
1.2、在新建好一个类后在类之前添加一个public
1.3、类的语法
[访问修饰符] class 类名
{
类的成员;(字段,属性,方法)
}
访问修饰符:public
类名:书写规则是要求每个单词的首字母都要大写
1.4、类的实例化(创建对象):我们写好一个类之后,需要创建这个类的对象
使用关键字new来创建,必须写在main函数中
类名 对象名=new 类名();
1.5、字段:在类中存储数据 写法:修饰符 _字段名
给新建对象赋值:新建对象名. _字段名()
1.6、类中的成员如果不加访问修饰符,默认是private
private:私有的,表明只能在类的内部访问,出了这个类之后,
就访问不到了,若想在类外访问就要加public
在类中写的方法,若有static则为静态方法,没有则非静态
1.7、在类中写方法若想输出对象的值:this._字段名(this表示当前这个类的对象,this的作用是用来输出字段的值)
1.8、类是不占内存的,而对象是占内存的
下面是例题代码
Person代码块
namespace 第九天练习代码
{
public class Person
{
public string _name;
public int _age;
public char _gender;
public void SayHello()
{
Console.WriteLine("大家好,我叫{0},我今年{1}岁,我是{2}生",this._name,this._age,this._gender);
}
}
}
Program代码块
class Program
{
static void Main(string[] args)
{
Person isPerson = new Person();
isPerson._age = 18;
isPerson._name = "张三";
isPerson._gender = '男';
isPerson.SayHello();
Console.ReadKey();
}
}
2 类的属性
2.1、在一个类中应该给每个字段都去配备一个属性,属性就是为了保护字段,对字段的取值和设置进行一个设定,那么相应的在声明字段时就不能添加public,是为了保证数据是一个隐私状态,而在第一节中添加了public是因为当时没有引入类的属性,那么相应了在类的方法中赋值要改为this.属性名,属性的本质是由于两个方法组成的
属性的语法:
public string 命名
{
get{ return 字段 } 当取值时用get方法
set{ 字段=value; } 当给属性赋值时用set方法
}
2.2、字段就是女人,属性就是男人。说明属性是为了保护字段
Person 代码块
public class Person
{
string _name;
public string Name
{
get { return _name;}
set { _name = value; }
}
int _age;
public int Age
{
set { _age = value; }
get { return _age; }
}
char _gender;
public char Gender
{
set { _gender = value; }
get { return _gender; }
}
public void SayHello()
{
Console.WriteLine("大家好,我叫{0},我今年{1},我是{2}生", this.Name, this.Age, this.Gender);
}
}
Program代码块
Person Aperson=new Person();
Aperson.Age = 18;
Aperson.Gender = '男';
Aperson.Name = "张三";
Aperson.SayHello();
Console.ReadKey();
2.3、属性分为三种
既有get方法也有set方法的属性我们称之为可读可写属性
只有get方法没有set方法我们称之为只读属性
只有set方法没有get方法我们称之为只写属性
2.4、当输入的值出现异常时,可以在get,set方法中添加判断语句,通常只在其中之一添加判断语句
2.5、类的练习题:student
定义一个学生类,有六个属性,分别为姓名、性别、年龄、语文、数学、英语成绩。
有2个方法:
一个打招呼的方法:介绍自己叫XX,今年几岁了。是男同学还是女同学。
两个计算自己总分数和平均分的方法。{显示:我叫XX,这次考试总成绩为X分,平均成绩为X分}
实化两个对象并测试:
张三 男 18 三科成绩为:90 95 80
小兰 女 16 三科成绩为:95 85 100
3 构造函数
3.1、主要作用就是对,对象进行初始化(在类中来创建)
3.2、构造函数其实就是一个函数,只不过是一个特殊的函数。
语法:
public 构造函数名(传入参数:数据类型 字段名)
{
代码(判断条件);
this.字段=字段名;
}
没有返回值,连void都不能写,构造函数的名称必须和类名一致
3.3、调用构造函数
new的作用:
1)、在内存的堆中开辟空间
2)、在开辟的堆空间中创建对象
3)、调用对象的构造函数
3.4、在创建构造函数之后,就可以在创建类的对象中填入所需要的数据
类名 对象名=new 类名(字段的数据);
而这样做就可以避免重复调用属性来输入数据
3.5、1)、可以重载(方法的名称相同但方法的参数不同,参数个数相同但类型不同或参数类型相同但个数不同 )
2)、类中默认会有一个无参数的构造函数,当你写了一个新的构造函数后,那个默认的无参数的
构造函数就被干掉了
4 值类型和引用类型
4.1、值类型:int double char bool decimal struct enum
引用类型:string 数组 自定义类
4.2、常用的内存:堆 栈 静态存储区域
值类型是存在栈中,引用类型是存在栈中
5 静态和非静态的区别
5.1、静态成员需要被static修饰,非静态成员不需要加static。
5.2、问题1:在一个非静态类中,是否允许出现静态成员?
答:非静态类中是可以出现静态成员的。
问题2:在非静态函数中,能不能够访问到静态成员?
答:在非静态函数中,既可以访问到非静态成员,也可以访问到静态成员。
问题3:在静态函数中,能不能够访问到非静态成员?
答:静态方法只能够访问到静态成员。
问题4:在静态类中能否出现非静态成员?
答:不可以,在静态类中,只允许出现静态成员。
5.3、在调用上,静态和非静态的区别
1、在调用实例成员的时候,需要使用对象去调用
2、在调用静态成员的时候,必须使用类名.静态成员名;
3、静态类是不允许创建对象的
6 垃圾回收期
6.1、GC Gargbage Collection
当我们程序结束之后,GC会扫描整个内存,发现,如果有的空间没有被指向,
则马上自动把这块空间销毁。
7 面向对象练习
问题:
写一个Ticket类,有一个距离属性(本属性只读,在构造方法中赋值),不能为负数,有一个价格属性,价格属性只读,并且根据距离distance计算价格Price (1元/公里):
0-100公里 票价不打折
101-200公里 总额打9.5折
201-300公里 总额打9折
300公里以上 总额打8折
有一个方法,可以显示这张票的信息.
测试上面的类
Ticked类代码块
class Ticked
{
double _distance;
public double Distance
{
get { return _distance; }
}
//构造函数
public Ticked(double distance)
{
if (distance < 0)
{
distance = 0;
}
this._distance = distance;
}
double _price;
public double Price
{
get
{
if (_distance >= 0&&_distance<=100)
{
return _distance * 1.0;
}
else if(_distance>=101&&_distance<=200)
{
return _distance * 0.95;
}
else if (_distance >= 201 && _distance <= 300)
{
return _distance * 0.9;
}
else
{
return _distance * 0.8;
}
}
}
public void ShowTicket()
{
Console.WriteLine("{0}公里需要{1}元", this.Distance, this.Price);
}
}
Program代码块
class Program
{
static void Main(string[] args)
{
Ticked t = new Ticked(150);
t.ShowTicket();
Console.ReadKey();
}
}
8 不同项目之间类的调用
8.1、在一个项目中引用另一个项目的类的步骤
1、添加要引用的类所在的项目。
2、引用命名空间(在最上端using处添加using namspace后面的代码;)
8.2、访问修饰符
public :公开的,公共的
private:私有的,只能在类的内部访问,出了这个类之后,就访问不到了。
能够修饰类的访问修饰符只有两个:
1)、public
2)、internal:表示只能在当前程序集的内部进行访问,出了这个程序集就访问不到啦。
对于咱们而言,现阶段就将程序集理解为当前项目。