黑马程序员(3)——面向对象、类、方法

Windows Phone 7手机开发.Net培训、期待与您交流!

一、面向对象

       简单说说自己的认识。我们先来看看“对象”,什么是对象?我们在现实生活中所能看到的一切都可以称为对象  。比如,企业、医院、宠物、植物、人。。。等等。在面向对象编程中,对象往往被当作一个类,类有属  性和行为。我们以医院为例来说,医院有医生,有护士等,在医院可以做CT,B超等。在面向对象编程中  ,我们定义一个hospital 类,其有属性(医生,护士)和行为(做CT,做B超)。这就是一个简单的面向  对象编程。其实,我们不光可以把医院做为一个类,我们还可以把医生做为一个类,医生有其属性(年龄,姓名  ,性别等)和其行为(检查病人,开处方,做手术等)。甚至我们可以把儿科医生定义为一个类,同样,  骨科,外科,内科等医生,我们都可以分别定义为一类,但这些类都具有同样的属性(年龄,姓名,性  别等)甚至行为,难道每个类我们都要依次定义这些属性吗?答案是否定的。我们可以定义一个医生类,定义这些共有属性和行为。儿科医生,骨科医生等都继承自这个医生类,  这样就具有了医生类的所有属性和行为。这在面向对象编程中被称为继承。

我们再来看一个例子。
人,有白人,黑人,黄种人等。人有年龄,性别,会吃饭。狗有白毛的狗,有黑色的狗等,狗有年龄  ,性别,会吃饭,咬人。在这种情况下,我们可以把人定义为一个基类(有性  年龄,性别和行为吃饭等),黑人,白人,黄  种人都继承自“人”这个类。我们再“狗”定义为一个类(有属性  年龄,性别和行为吃饭,咬人等),白狗,黑狗都继承于这个“狗”类。在这里,我们可以看到,狗所具有的一些属性在“人”这个类里面已经具有了,我们没有 必要重新在“狗”类中定义的,“狗”类中只需要定义其独特的行为或属性,比如  :咬人。而黑狗,白狗等继承自“人”和“狗”这两个类。这样就不存在重复定义  的问题了。但在C#和Java中都不支持多重继承。那怎么办呢?这时候就诞生了一个“接口”的概念。一个类可以实现多个接口。在上例中,可以定义一个“动物”的接口(人也是一种动物嘛),在接口中定义人和狗共有的年龄,性别,吃饭等属性和行为。再定义一个“人”这样的基类,并实现这个接口,然后白人,黑人等类再继承“人”这个基类就可以了。狗也同理。


————————————————————————————————————————————————————————————————————————————


二、类

类,是创建对象的模板,每个对象都包含数据,并且提供了处理和访问数据的方法。换言之,类,定  义了每个对象,也就是“实例”包含什么数据和功能。比如我们定义一个“医生”类,并且实例化一个。我们看下面的代码:

using System;
namespace gosoa.com.cn
{
public class Doctor
{
public Doctor(){}
public Doctor(string name,byte age)
{
this._name=name;
this._age=age;
}
private string _name;
private byte _age;
public string Name
{
get{return this._name;}
set{this._name=value;}
}
public byte Age
{
get{return this._age;}
set{this._age=value; }
}
public string doSth()
{
return "我会给人治病喔~~";
}
public static string doAnth()
{
return "执行的另一个静态方法";
}
}
public class OneDoctor
{ 
static void Main()
{
Doctor dc=new Doctor();
dc.Name="李四";
dc.Age=25;
Doctor dc2=new Doctor("张三",35);
Console.WriteLine(dc.Name);
Console.WriteLine(dc.Age);
Console.WriteLine(dc2.Name);
Console.WriteLine(dc2.Age);
Console.WriteLine(dc.doSth());
Console.WriteLine(Doctor.doAnth());
}
}
}
       在这个例子中,public class Doctor 便是声明了一个类。_name和_age是其两个属性。doSth()是其 中的一个方法(即对象的行为)。  Doctor dc=new Doctor() 用来实例化了一个Doctor类,也就类似实例化  了一个对象,产生了一个新医生。Doctor dc2=new Doctor("张三",35);是实例化的另外一个类,也就是  另外一个医生。在Doctor类中,public Doctor(){} public Doctor(string name,byte age) 这两个方法叫做构造函数。是用来初始化类的,在每个类被实例化的时候,会自动调用。

public string Name
{
get{return this._name;}
set{this._name=value;}
}

这段代码是用来设置和获取类的属性的。也就类似java 中的  getName 和  setName 方法。只是在C#中  这变得更容易了。
注意一点:类是存储在托管堆上的引用类型。


————————————————————————————————————————————————————————————————————————————


三、方法
1、 方法概述
方法和C语言中的  函数共享同一个理念。一直以来,我们在用的Main()方法就是个例子。
还有上例中  public string doSth() 也是一个方法。其中,public是  类的修饰符,string是方法
的返回值,也可以  没有返回值,即  void ,doSth是方法名称。()括号必须有,在括号中可
以有参数,如Doctor类的构造函  数  public Doctor(string name,byte age) 就有两个参数。方
法体则必须用一对{}括起来。

方法的调用,则需要先实例化类,然后调用类的某个方法。上例中Doctor dc=new Doctor();
来实例化  了类,然后  dc.doSth() 就是调用了Doctor类的方法。
如果方法是静态的,即  static,则不需要实例化类,直接使用  类名.方法名  就可以调用了。
如上例  中  Console.WriteLine(Doctor.doAnth()); 即是直接调用了静态的doAnth方法。

2、方法的参数
参数可以通过引用或者值传递给方法。具体有什么区别呢?
我们来看个例子。

using System;
namespace gosoa.com.cn
{
public class OneDoctor
{
static void FunctionTest(int [] arr, int x)
{
arr[0]=100;
x=10;
}
static void Main()
{
int [] arrTemp={0,1,2,3,4};
int y=30;
Console.WriteLine(arrTemp[0]);
Console.WriteLine(y);
FunctionTest(arrTemp, y);
Console.WriteLine(arrTemp[0]);
Console.WriteLine(y);
}
}
}

本例的输出结果是0,30,100,30 因为数组是引用类型,在调用方法前后,引用类型的修改会保留下  来,而值类型的修改不会保留下来。

3、ref 参数。
我们把上例中的方法修改为  static void FunctionTest(int [] arr, ref int x) 这样,调用的时候也加上 ref 即:functionTest(arrTemp, ref y); 执行后的结果就是0,30,100,10。
ref 关键字是强迫参数通过引用传递。 

注意:在调用有ref参数的方法时,必须将参数要传递的参数提前初始化。但在调用out参数的方法时  ,就不必提前初始化。
4、out 参数
在上例中,我们稍作修改。

static void FunctionTest(out int x)
{
x=100;
}
static void Main()
{
int y;
FunctionTest(out y);
Console.WriteLine(y);
}

在Maim()函数中调用FunctionTest之前,y并没有初始化。但其输出结果确实100;因为这样属于引用 传递,值的修改会被保留下来。


5、方法的重载
所谓重载就是指  方法名相同,而参数不同(参数类型,参数个数)看下面一个例子

using System;
namespace gosoa.com.cn
{
public class test
{
static int FunctionTest(int x)
{
return x+100;
}
static string FunctionTest(string str)
{
return str;
}
static int FunctionTest(int x,int y)
{
return x+y;
}
static void Main() 
{
Console.WriteLine(FunctionTest(10) );
Console.WriteLine(FunctionTest("gosoa.com.cn") );
Console.WriteLine(FunctionTest(5,20));
}
}
}

在这里例子中,有三个方法functionTest 其参数都不一样。在调用的时候,系统会根据传递的参数自  动选择调用哪个方法的。这就是方法的重载。在这里注意,重载的条件是,必须参数类型不同,或者参数个数不同。



Windows Phone 7手机开发.Net培训、期待与您交流!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值