------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------
(面向对象不是取代面向过程的)
——类,对象
类:类是抽象的,不占内存
规则:人,碗,车,等都属于类
例码:
1.创建一个”人”类
classPerson//创建一个“人”类
{
publicint Height;//人类中的身高字段
publicint Age;//人类中的年龄字段
publicstring Name;//人类中的姓名字段
publicvoid SayHello()//人类中的方法:SayHello
{
Console.WriteLine("HELLO");
}
}
对象:是具体的,占内存
规则:张三,陶瓷碗,牌照为8888的奥迪车等都属于类中的对象
例码:
Person ZhangSan =newPerson();//实例化人类为ZhangSan,ZhangSan就是一个对象
——方法Method
方法就是类能够执行的动作
例如:问好,吃饭等
——类的继承
类之间可以有继承关系
例如:”电脑“类可以从“电器”类继承
优点:“电脑”类只需要定义自己特有的字段,方法就可以
父类(Parent)和基类(Base):电脑类是电器的子类
——面向对象的三个特性
封装,继承,多态
——成员访问级别
简介:
-
字段,方法,属性都可以叫做类的成员,他们都需要定义访问级别
-
访问级别的用处在于控制成员在哪些地方可以被访问,这样到达面向对象中“封装的目的
几个访问级别:
1.Public:任何地方都可以访问
2.Private:默认级别,只能由本类中的成员访问
另外还有:internal,protected
例码:
1.访问级别
namespace访问级别
{
classProgram
{
staticvoid Main(string[] args)
{
Person2 p =newPerson2();//实例化person类为p
p.Age = 20;
//p.Name ="ddd";//不可访问
p.睁眼();//不可访问
Console.ReadKey();
}
}
//访问级别:
classPerson2//创建以一个类Person2
{
publicint Height;//定义int字段Height
publicint Age;//定义int字段Age
privatestring Name;//定义string字段Name
publicvoid SayHello()
{
睁眼();//可以访问
Console.WriteLine("大家好我叫{0},我今年岁了{1},我的身高是{2}",this.Name,this.Age,this.Height);
}
privatevoid睁眼()
{
Console.WriteLine("睁开双眼");
}
}
}
——属性
惯用法:属性开头字母大写,字段开头字母小写
Get:只读属性,可设置访问级别
Set:只写属性,可设置访问级别
字段和属性的区别:
属性看似字段,不是字段,可以进行非法值控制,可以设置只读
5.例码:
1.创建一个属性:
classProgram
{
privateint age;
publicint Age//Age没有保存数据,都是保存到age中了
{
set//赋值
{
if (value < 0)//public字段和属性的区别,可以进行非法设置值的判断
{
return;
}
this.age =value;//value代表用户赋值过来的值
}
get//取值
{
return this.age;
}
}
publicvoid SayHello()
{
Console.WriteLine("我的年龄是{0}", Age);
}
2.没有赋值的属性
classPerson
{
publicint Age
{
set//没有赋值
{
}
get//不管调用age时赋的值为多少,返回的值都为3,所以p.Age的值一直为3
{
return 3;
}
}
}
staticvoid Main(string[] args)
{
Person p =newPerson();
p.Age = 30;
p.Age = p.Age + 1;
Console.WriteLine(p.Age);
Console.ReadKey();
}
3.设置只读属性
classPerson3
{
privateint age;
publicint Age //只读属性
{
get {return age; }
}
publicvoid IncAge()
{
age++;
}
}
staticvoid Main(string[] args)
{
Person3 p3 =newPerson3();
p3.Age = 20;//不可赋值
p3.IncAge();
p3.IncAge();
Console.WriteLine("年龄为:"+p3.Age);
Console.ReadKey();
}
4.没有特殊的约束,编译器自动识别私有字段和get;,set;代码块
classPerson4
{
publicint Age
{
get; //编译器自动帮我们生成私有字段set,get代码块
set;
}
publicstring Name
{
get;
set;
}
}
staticvoid Main(string[] args)
{
Person4 p4 =newPerson4();
p4.Age = 30;//可以访问,声明字段
p4.Name ="张三";
Console.WriteLine("我叫{},我的今年{1}岁了",p4.Age,p4.Name);
}
——对象的引用
简介:
Int ,datetime,bool,char等类型都属于值类型(ValueType),赋值的时候是传递拷贝
普通的对象则是引用类型,赋值的时候是传递引用
例码:
1.对象的引用
namespace对象的引用
{ classProgram
{
staticvoid Main(string[] args)
{
//Int,datetime,bool,char等类型都属于值类型(ValueType),赋值的时候是传递拷贝
int i = 10;
int j = i;
i++;//对j没有影响
Console.WriteLine(j);//输出结果为10
//普通的对象则是引用类型,赋值的时候是传递引用
Person p1 =newPerson(10);//向person中传递参数
Person p2 = p1;
p1.Age++;
Console.WriteLine(p2.Age);//输出结果为11
Console.ReadKey();
}
classPerson
{
publicint Age {get;set; }
public Person(int age)
{
this.Age = age;
}
}
}
}
2.通过函数来传递对象
namespace通过函数来传递对象
{
classProgram
{
staticvoid Main(string[] args)
{
//Int,datetime,bool,char等类型都属于值类型(ValueType),赋值的时候是传递拷贝
int i = 10;
int j = i;
i++;//对j没有影响
Console.WriteLine(j);//输出结果为10
//普通的对象则是引用类型,赋值的时候是传递引用
Person p1 =newPerson(10);//向person中传递参数
Person p2 = p1;
p1.Age++;
IncAge(p2);
Console.WriteLine(p2.Age);//输出结果为12
Console.ReadKey();
}
staticvoid IncAge(Person p)
{
p.Age++;
}
classPerson
{
publicint Age {get;set; }
public Person(int age)
{
this.Age = age;
}
}
}
}
——构造函数
简介:
-
构造函数用来创建对象,并且在构造函数中对对象进行初始化
-
用来创建对象的特殊函数,函数名和类名一样,没有返回值,连void都不用
-
构造函数可以有参数,new对象的时候传递函数参数即可
-
构造函数可以重载,也就是有多个参数不同点构造函数
-
如果不指定构造函数,则类有一个默认的无参构造函数
-
如果指定了构造函数,则不再有默认的无参构造函数,如果需要无参构造函数,则需要自己来写
例码:
1.创建一个构造函数
namespace构造函数
{
classProgram
{
staticvoid Main(string[] args)
{
Person p1 =newPerson("tom");
}
}
classPerson
{
public Person(string name)
{
}
}
}
2.构造函数的重载
namespace构造函数的重载
{
classProgram
{
staticvoid Main(string[] args)
{
Person p1 =newPerson("tom");
Person p2 =newPerson();
}
}
classPerson
{
//多个构造函数可以实现构造函数的重载
public Person(string name)//构造函数1,里面没有任何参数
{
}
public Person()//构造函数2,里面没有任何参数
{
}
}
}
3.有参数的构造函数
namespace有参数的构造函数
{
classProgram
{
staticvoid Main(string[] args)
{
Person p1 =newPerson("tom");
Person p2 =newPerson();//初始化对象
}
}
classPerson
{
publicstring Name {get;set; }//在后面加上{ get; set; },就变成了属性
publicint Age {get;set; }
public Person(string name)//构造函数1,里面没有任何参数
{
}
public Person()//构造函数2,有参数
{
Name ="未命名";
Age = 0;
}
}
}
有参数的构造函数的意义:初始化对象
——继承
简介:
-
子类可以可以继承父类中的属性,父类中可以有多个子类
-
Object是所有类的基类,所有的类都从 object继承,一个 object指针指向任何对象都行
例码:
1.继承的实例
namespace继承
{
classProgram
{
staticvoid Main(string[] args)
{
中国人 c1 =new中国人();
c1.Name ="李小龙";
c1.SayHello();
c1.户口 ="重庆";//声明自己自己特有的属性户口
c1.功夫();//声明自己特有的属性功夫
韩国人 k1 =new韩国人();
k1.Name ="李孝利";
k1.SayHello();
k1.做泡菜();
Console.ReadKey();
}
}
classPerson//父类
{
publicstring Name {get;set; }
publicint Age {get;set; }
publicvoid SayHello()
{
Console.WriteLine("{0}:Hello!",this.Name);
}
}
//父类中可以有多个子类
class中国人 :Person//声明一个子类:中国人
{
publicstring户口{get;set; }
publicvoid功夫()
{
Console.WriteLine("我打!!");
}
}
class韩国人 :Person//声明一个子类:韩国人
{
publicstring称号{get;set; }
publicvoid做泡菜()
{
Console.WriteLine("泡菜哦依稀啊思密达");
}
}
}
注意:
//父类与子类的继承优先级别
//可行
Person p1 = c1;
p1.SayHello();
Person p2 = k1;
p2.SayHello();
//不可行
//中国人c2 = new Person();
//韩国人k2 = new Person();
//Object是所有类的基类,所有的类都从object继承,一个object指针指向任何对象都行
object obj = c1;
object obj2 = k1;
object obj3 = p1;
——异常与异常处理
简介:
传统的错误表示方式:错误码。举例。需要知道不同错误码的含义,如果不处理错误码,则程序可能陷入不可以预置的错误。
错误码的缺点:不处理很难发现,每次处理很麻烦,难以看出错误的原因,容易使得程序进入不确定状态
Try catch,Exception ex异常也是对象
Exception类主要属性:Message,StackTrace
发生异常后:程序默认退出,后续代码不会被执行,catch以后的代码则会继续执行。
不要吃掉异常:一般情况下不需要处理异常
扔出自己的异常:thrownewException("需要显示的异常信息");
例码:
1.异常处理的格式
try//代码出错后,try后面的代码不再执行,只执行catch里的代码
{
运行的可能出错的代码
}
catch(Exception ex)
{
代码出错后的处理
}
//如果代码没有出错,其他代码正常执行
2.Exception的应用
try
{
int i =Convert.ToInt32("ABC");
}
catch(Exception ex)
{
Console.WriteLine("数据错误" + ex.Message);//ex.Message:错误的信息
Console.WriteLine("异常堆栈" + ex.StackTrace);//ex.StackTrace,数据错误的点
}
3.抛出自己要显示的异常信息
static void Main(string[] args)
{
try
{
string desc =GetAgeDesc(300);
}
catch (Exception ex) //throw:扔,catch:抓。出现异常的时候已经new好了一个
{ //Exception对象扔(throw)出来,咱么抓住(catch)即可
Console.WriteLine("数据错误:"+ex.Message); //此时的ex.Message调用GetAgeDesc为标准类输出信息
}
Console.ReadKey();
}
staticstring GetAgeDesc(int age)
{
if (age > 0&& age <= 3)
{
return"婴幼儿";
}
elseif (age > 3&& age <= 18)
{
return"青少年";
}
elseif (age > 19&& age < 150)
{
return"成年人";
}
elseif (age < 0)
{
thrownewException("你丫来自反物质世界吧");
}
else
{
thrownewException("骚年你见过老佛爷吧");
}
}
——常量与静态成员
量:常量名要大写,一定不会变化值才能声明为常量
Const:常量
例码:
1.声明一个常量
constint pi = 3;//pi声明为常量,常量可以声明成全局常量
2.声明一个全局常量
publicconstint pi = 3;//public const 不用new一个类就可以直接调用
3.常量的应用
int r = 10;
constint pi = 3;//pi声明为常量,常量可以声明成全局常量
int l = 2 * 3 * r;
Console.WriteLine("周长:{0}", l);
//pi = 9;//报错
int m = 3 * r * r;
Console.WriteLine("面积:{0}", m);
静态成员:
Static:全局变量
Static方法:不用new就能用的方法,是一个普通函数,在static方法中国可以调用其它static方法,字段,属性,但是不能调用非static方法,字段,属性,在非static方法中可以调用static的方法,字段。
c) 例码:
1.创建一个静态成员
public class Person
{
publicstaticint TotalCount;
publicint Age;
}
2.静态成员的应用
namespace静态成员的应用
{
classProgram//静态成员
{
staticvoid Main(string[] args)
{
//Person.Age=30;出错
Person.TotalCount = 30;//静态成员TotalCount不用new就能调用
Console.WriteLine((Person.TotalCount));
DoIt();//静态方法同样不用new
Dog d =newDog();//非静态成员需要new来实例化一个类
d.叫唤();
Person p1 =newPerson();
p1.Age = 300;
p1.SayHello();
Console.ReadKey();
}
publicstaticvoid DoIt()
{
Console.WriteLine("fff");
Console.WriteLine("使用全局变量:{0}",Person.TotalCount);
}
}
publicclassPerson
{
publicstaticint TotalCount;
publicint Age;
publicstaticvoid人口汇报()
{
//Console.WriteLine("总人口:{0},年龄:{1}",Age,TotalCount);
//在static成员中不能直接调用非static成员
}
publicvoid SayHello()
{
Console.WriteLine("我的年龄{0},全球总人口{1}",Age,TotalCount);
//在非static成员中可以调用static成员
}
}
publicclassDog
{
publicvoid叫唤()
{
Console.WriteLine("汪汪:{0}",Person.TotalCount);
}
}
}
静态类:
不能被实例化的类就是静态类,一般用来实现一些函数库,***Helper,SqlHelper,PageHelper
例码:
1.静态类的应用
amespace静态类
{
classProgram
{
staticvoid Main(string[] args)
{
ConsoleHelper.ReadInt();
Console.ReadKey();
//ConsoleHelper h =new ConsoleHelper();//静态类不能狗实例化
}
}
staticclassConsoleHelper//声明一个静态类
{
publicstaticint ReadInt()//声明一个静态方法
{
string str =Console.ReadLine();
returnConvert.ToInt32(str);
}
}
}
——命名空间
简介:
命名空间(namespace),用于解决类重名问题,可以看作类的文件夹
在代码中使用其他类的时候需要using类所在的namespace,例如,System.Collections.ArrayList,快速引入的方法,右键->解析
为什么使用Convert,Console等类不需要自己写using:如果代码和被使用的类在一个namespace则不需要using。
可以修改默认的namespace,因此不要认为在相同文件夹下就不用using,不再相同文件夹下就需要using
例码:
1.实例另一个文件夹的类
namespace _11命名空间
{
classProgram
{
staticvoid Main(string[] args)
{
Person p1 =newPerson();//实例本命名空间下的类
//实例本项目hr文件下的Person类就像文件的全路径一样
_11命名空间.hr.Person p2 =new hr.Person();
}
}
classPerson
{
}
}
2.引用命名空间来实现实例令一文件夹下的类
using System;
usingSystem.Collections.Generic;
using System.Linq;
using System.Text;
usingSystem.Threading.Tasks;
using _11命名空间.hr;//如果要使用的类和当前的类不再同一个namespace,则需要添加using引用
using _11命名空间.oa;//同一个文件夹下的类的namespace默认一样,但是允许不一样
using System.Collections; //为方便实例ArrayList而引用的命名空间
namespace _11命名空间
{
classProgram
{
staticvoid Main(string[] args)
{
Person p1 = newPerson();//实例本命名空间下的类
//实例本项目hr文件下的Person类,就像文件的全路径一样
_11命名空间.hr.Person p2 = new hr.Person();
//要实例另一命名空间下的类,还可以增加using引用来实现
Dog d = newDog();
ArrayList list = newArrayList();
}
}
classPerson
{
}
}
——索引器
定义索引器的方式:
String this[intindex]{get{return””;}set{}}
其中string为索引器的类型,[]为参数列表。进行索引器写操作就是调用set代码块
在set内部使用value得到用户设置的值,进行读操作就三执行get代码块
注意:索引器参数可以不止一个,类型也不限于int,几乎可以是任意类型
例码:
1.简单的索引
int[] value ={3,5,9,8};
int i = value[0];//通过[]来引用数组的元素,叫做索引
2.索引的应用
namespace索引器的应用
{
classProgram
{
staticvoid Main(string[] args)
{
//int[] value ={3,5,9,8};
//int i =value[0];//通过[]来引用数组的元素,叫做索引
Person p1=newPerson();
p1[1]="小明";
Console.WriteLine(p1[1]+" "+p1[2]);//输出为"小明二毛"
string s ="";
//s[0] = 'a';//报错,string类的索引器是只读的
Console.WriteLine(p1["tom",3,9]);//索引的重载
Console.ReadKey();
}
}
classPerson
{
privatestring FirsName ="大毛";
privatestring SecondNmae ="二毛";
publicstringthis[string name, int x,int y] //string为索引器的数据类型
{
get; //只有get,没有set
}
publicstringthis[int index]
{
set
{
if (index == 1)
{
FirsName = value;
}
elseif (index == 2)
{
SecondNmae = value;
}
else
{
thrownewException("错误的序号");
}
}
get
{
if (index == 1)
{
return FirsName;
}
elseif (index == 2)
{
return SecondNmae;
}
else
{
thrownewException("错误的序号");
}
}
}
}
}