1 方法的概念
用于表示类的行为与功能。
- 如人:吃饭、睡觉、走路、干活
- 动物:攻击、御敌、觅食、生殖
- 汽车:启动、停止、前进、后退
2 方法的声明
方法使用标准函数格式与可选的static修饰符来声明。
【修饰符】 返回值类型 <方法名>(【参数】)
{
//方法体
}
3 方法的调用
详细见“C#静态字段与非静态字段”http://blog.csdn.net/liyongliang_2012/article/details/7937123
4 方法的修饰符
访问修饰符 | 表示含义 |
无或private | 只能在所属类中访问 |
public | 访问不受限,即在任何地方都可以访问 |
internal | 只能在所属项目中访问 |
protected | 只能在所属类或由其派生而来的类中访问 |
protected internal | 只能在所属项目或从所属类派生而来的类中访问; 警告:C#未提供此概念,其实际效果要么是protected,要么是internal |
总结1:访问级别由高到低是——public、internal、protected、private——PIPP
其他修饰符 | 表示含义 |
static | 静态成员,也称共享成员,可以在类的实例之间共享,故可以将它们看作是类的全局对象。 |
5.方法的重载(overload)与重写(override)
5.1方法的重载
在一个类中定义多个方法名相同但参数列表(数目、类型、顺序)不同的方法,通过传递参数的不同来决定调用哪一个方法的操作叫做方法的重载(overload)。注意:仅是返回值不同并不能算是方法的重载,系统是要报错的。
【示例一】不同数量的参数方法重载演示
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 不同数量的参数方法重载演示
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("不同数量的参数方法重载---二元三元四元加法运算");
Console.WriteLine("二元加法运算");
Console.Write("输入第一个数:");
int v1 = int.Parse(Console.ReadLine());
Console.Write("输入第二个数:");
int v2 = int.Parse(Console.ReadLine());
con c = new con();
c.con1(v1, v2);//调用方法
Console.WriteLine("三元加法运算");
Console.Write("输入第一个数:");
v1 = int.Parse(Console.ReadLine());
Console.Write("输入第二个数:");
v2 = int.Parse(Console.ReadLine());
Console.Write("输入第三个数:");
int v3 = int.Parse(Console.ReadLine());
c.con1(v1, v2, v3);//调用方法
Console.WriteLine("四元加法运算");
Console.Write("输入第一个数:");
v1 = int.Parse(Console.ReadLine());
Console.Write("输入第二个数:");
v2 = int.Parse(Console.ReadLine());
Console.Write("输入第三个数:");
v3 = int.Parse(Console.ReadLine());
Console.Write("输入第三个数:");
int v4 = int.Parse(Console.ReadLine());
c.con1(v1, v2, v3,v4);//调用方法
Console.ReadLine();
}
}
class con
{
public void con1(int value1, int value2)
{
Console.WriteLine(value1+"+"+value2+"={0}",value2+value1);
}
public void con1(int value1, int value2,int value3)//重载con1方法
{
Console.WriteLine(value1 + "+" + value2 +"+"+value3+"={0}",value3+value2 + value1);
}
public void con1(int value1, int value2, int value3,int value4)//重载con1方法
{
Console.WriteLine(value1 + "+" + value2 + "+" + value3 +"+"+value4+"={0}",
value3 + value2 + value1+value4);
}
}
}
运行结果
【示例2】不同类型参数的方法重载演示
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 不同类型参数的方法重载演示
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("不同类型参数的方法重载---整型数加法、双精度浮点数加法");
Console.WriteLine("整型数加法");
Console.Write("输入第一个整型数:");
int v1 = int.Parse(Console.ReadLine());
Console.Write("输入第二个整型数:");
int v2 = int.Parse(Console.ReadLine());
con c = new con();
c.con1(v1, v2);//调用方法
Console.WriteLine("双精度浮点数加法");
Console.Write("输入第一个浮点数:");
double v3 = double.Parse(Console.ReadLine());
Console.Write("输入第二个浮点数:");
double v4 = double.Parse(Console.ReadLine());
c.con1(v3, v4);//调用方法
Console.ReadLine();
}
}
class con
{
public void con1(int value1, int value2)
{
Console.WriteLine(value1+"+"+value2+"={0}",value2+value1);
}
public void con1(double value1, double value2)//重载con1方法
{
Console.WriteLine(value1 + "+" + value2 + "={0}", value2 + value1);
}
}
}
运行结果
5.2 方法的重写
返回值类型、方法名、参数列表完全相同。方法重写又称方法的覆盖,指的是在子类中重新定义(从)父类中(继承而来)的方法。注意:必须用virtual声明父类(基类)方法为虚,用override声明此方法的重写。
- 不能重写非虚方法或静态方法。重写的基方法必须是 virtual、abstract 或 override 的。为什么 override 也可以重写呢?因为基类中的 override 实际上是对基类的基类进行的重写,由于继承可传递,所以也可以对基类中 override 的方法进行重写。
override 声明不能更改 virtual 方法的可访问性。override 方法和 virtual 方法必须具有相同的访问级别修饰符。
不能使用修饰符 new、static、virtual 或 abstract 来修改 override 方法。
重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是 virtual、abstract 或 override 的。
- 重写override一般用于接口实现和继承类的方法改写,要注意:
1、覆盖的方法的标志必须要和被覆盖的方法的名字和参数完全匹配,才能达到覆盖的效果;
2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;
3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
【示例】
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 方法重写演示
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("方法重写----咖啡列表");
Coffee coffee = new Coffee();
coffee._coffee();
Coffee klcoffee = new kl();
klcoffee._coffee();
bm bmcoffee =new bm();
bmcoffee._coffee();
m mcoffee = new m();
mcoffee._coffee();
Console.ReadLine();
}
}
class Coffee
{
public virtual void _coffee()
{
Console.WriteLine("咖啡");
}
}
class kl : Coffee
{
public override void _coffee()
{
Console.WriteLine("麝香猫咖啡");
}
}
class bm : Coffee
{
public override void _coffee()
{
Console.WriteLine("蓝山咖啡");
}
}
class m : Coffee
{
public override void _coffee()
{
Console.WriteLine("摩卡咖啡");
}
}
}
运行结果
5.3方法的重载与重写的比较
6.