第一节 你有对象?哼,我也有!Part 5

5、既然她数学这么好,那我就考她几道题!

小色:这人长大了,记性也就差了,有时候这事刚做完,就不记得刚才做什么了……对了,我刚说什么来着?

小力:晕,你就逗我吧。不过想想也是,前两天表妹问了我一道初中的二元一次方程组的题,说什么都想不起来怎么做了。这以前可都是我的强项,全班男生都追着管我要作业抄呢。

小色:是啊,前一阵考成人专升本考试,有一道题说是怎么做窗户能使其面积最大。反正里面用到了圆面积公式S=πr2和三角形面积公式S=ah/2,说什么都想不起来了。最后放弃了那道题丢了15分。

小力:这你都忘了啊?你要是说牛顿第X定律我可能忘了公式是啥,要是说这个的话,我早就熟记于心。那你还记得π的值是多少啊?

小色:当然了,π=3.141592653589793238462643383279约等于3.14(源自百度百科),这个可是恒久不变的数字。就和唐僧说过:“人是人她妈生的,妖是妖她妈生的”的真理一样。嘿嘿~

小力:你真贫啊。那既然公式你都有了,你的对象数学又那么好,你就让她帮你算算不久得了。

小色:说的也是。刚才咱们也说了π应该是个恒久不变的内容,但是变量我们却可以修改它,有没有什么方法能让π不允许改变,定义什么就是什么呢?

小力:当然有啊,C#中不是有一个关键字是用来定义常量的吗?const修饰的的成员叫做常量,必须在定义时就规定好其内容并且在之后的使用中不允许修改。

小色:对对,是有这么一个修饰符,那我写出来让她给我算算。

class Girl

    {//…省略部分代码…//

        private const double PI = 3.14;

        internal static void Triangle(double a, double h)

        {//三角形计算方法

            Console.WriteLine("三角形面积为:{0}", a * h / 2);

        }

        internal static void Circle(double r)

        {//圆形计算方法

            Console.WriteLine("圆形的面积为:{0}", PI * r * r);

        }

       //…省略部分代码…//

  }

class Program

    {       

        static void Main(string[] args)

        {

            Girl.Calculate(10.34);

            Girl.Calculate(20, 30);           

            Console.ReadLine();

        }

}

1.5.1

圆形的面积为:335.714984

三角形面积为:300

小力:奇怪了,结果是没问题,怎么我看你的代码跟以前不一样了呢。在两个计算方法前的internal我记得是在让方法只在程序集中访问,后面的static就没有见过了,还有,调用两个方法的时候不是都需要先将对象实例化然后才能用点运算符调用吗?怎么直接用类名.方法名( )就调用了呢?

小色:那个static叫做静态修饰符,被它修饰的成员必须直接从类级别来调用,而不能从类的实例调用。比如我们一直在用的System.Console类,由于我们引入了System的命名空间,所以前面的内容可以省略,但是我们也没有使用Console c=new Console( )来实例化后再调用的c.WriteLine();啊,而是直接使用的Console.WriteLine();对吧!

小力:说的也是!想起来了,好像Math类里也都是静态的方法呢。我使用三角函数的时候都是直接点出来的。

小色:不过被static修饰过的静态方法和通过实例对象产生的实例方法有一些不同

 

静态方法

实例方法

需要static关键字

不需要static关键字

使用类名调用

使用实例对象调用

可以访问静态成员

可以直接访问静态成员

不可以直接访问实例成员

可以直接访问实例成员

不能直接调用实例方法

可以间接访问实例方法、静态方法

调用前已被初始化

实例化对象时初始化

小力:也就是说,被静态修饰过的成员和实例成员使用起来还是有一些差别的,看来是得注意了。

小色:再看看上面的例子,同样都是计算的方法,不管是圆形的面积计算三角形的面积计算还是圆柱体的面积计算,都是为了同一个计算目的而做的,而唯一不同的就是所提供的条件参数不同,三角形需要提供底和高,圆形需要提供半径而已。这又让你想到了什么呢?

小力:嗯……参数列表不同……对了,和上面的构造方法的重载很像哦!

小色:对,我们之前说了在类中出现了两个或者两个以上的带有不同参数列表的构造方法时,就发生了构造方法(函数)的重载,而构造函数必须要和类名相同,其实重载必须具备两个条件:名称相同但是参数列表不同。重载与返回值类型无关,而参数列表的不同指的是参数类型和个数的不同,与顺序和参数名称无关。这就是重载,所以,在这里要想让两个方法同样都是完成计算功能,并且提供的参数不同的话,就可以考虑使用方法重载

小力:那让我来改写吧:

   class Girl

    {//…省略部分代码…//

        private const double PI = 3.14;

        internal static void Calculate(double a, double h)

        {//三角形计算方法

            Console.WriteLine("三角形面积为:{0}", a * h / 2);

        }

        internal static void Calculate(double r)

        {//圆形计算方法

            Console.WriteLine("圆形的面积为:{0}", PI * r * r);

     } 

//…省略部分代码…//

}

class Program

    {       

        static void Main(string[] args)

        {

            Girl.Calculate(10.34);

            Girl.Calculate(20, 30);

            Console.ReadLine();

        }

}

1.5.2

小色:对,这样的话我们调用起来都是同一个方法名称,由于传递的个数不同程序就会认为调用的是两个不同的方法,这就是重载了。

小力:看来你的对象能做的事情还不少嘛,会做菜,还会数学。要是想打招呼的话还能让她在创建的时候在构造方法里面写上打招呼的语句。也不知道做完这么多事情以后,说”ByeBye”要在什么地方做呢?难道还要写一个方法我们调用它让她说吗?这样的话她就太不懂礼貌了。

小色:看你说的,这事能难得倒我的对象?

        (请看下回:正儿八经说Static

 

完稿日期:2009116  1241

转载于:https://www.cnblogs.com/mgod/archive/2009/01/16/1376915.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值