头歌 C# 专题四 类与对象第5节

 

第5关:static静态对象

  • 任务要求
  • 评论28

任务描述

大学校园内有各种各样的社团,一般每个社团都会不定期举办一些大型活动,活动的时间和地点可能会有所差异。例如某摄影社团2018年上半年活动表:

 
  1. 次数统计 时间 地点
  2. 1 2018-03-22 北京大学
  3. 2 2018-05-01 中国人民大学
  4. 3 2018-06-01 清华大学

本关任务:根据编程要求编写一个大型活动类,要求能够统计举办活动的次数。

相关知识

static

使用static修饰符声明一个静态成员。我们刚学习过类class,类是以对象为基础,而静态变量是与类类型同一级别的类型,不属于任何对象。

staitc修饰符可用于修饰类、方法、属性、操作符、事件或是构造函数,但不可用来修饰索引、Finalize()(即析构函数)等。

使用方法如下:

 
  1. static <修饰对象>

例如,我们使用static修饰类:

 
  1. staitc class Person{
  2. //类成员
  3. }

静态变量的声明和使用

使用static修饰类成员变量将不会被对象实例引用。相反,该成员变量可通过变量类型名称直接使用。 例如:

 
  1. class Person
  2. {
  3. public static string name; //使用static修饰
  4. public int age;
  5. }
  6. class myCaller {
  7. public static void Main() {
  8. Person p = new Person();
  9. p.age = 20; //此处仅能使用age
  10. }
  11. }

以上这段代码,在类myCaller中实例化类Person对象p,该对象无法调用成员变量name

使用类名称调用name: 具体如下代码:

 
  1. class Person
  2. {
  3. public static string name;
  4. public int age;
  5. }
  6. class myCaller {
  7. public static void Main() {
  8. Person p = new Person();
  9. p.age = 20; //此处仅能使用age
  10. Person.name = "Jackie"; //直接使用类型Person调用
  11. }
  12. }

由于name为静态变量,所以每一次赋值都会更改name的值,而不是像类Person实例化多个对象的属性值,类成员变量对应的对象属性值可互不相同,例如:

 
  1. class Person
  2. {
  3. public static string name;
  4. public int age;
  5. }
  6. class myCaller {
  7. public static void Main() {
  8. Person p1 = new Person(); //创建三个实例
  9. Person p2 = new Person();
  10. Person p3 = new Person();
  11. p1.age = 10; //三个实例互不相同
  12. p2.age = 20;
  13. p3.age = 30;
  14. Person.name = "Jackie"; //共同拥有属性name
  15. }
  16. }

在调用类myCaller中实例化三个对象p1p2p3,三个对象age属性分别为102030,而name有且仅有一个值"Jackie"

实际中,对于静态成员可以这样理解:我们定义一个类employee来表示公司员工,假定employee包含一个方法用来计算员工数量,包含一个属性用来保存员工数量。当我们使用empliyee实例化一个员工对象的时候,员工对象自身和计算、存储员工数量的方法、属性并无太大关联,相对的,该方法、属性更适用于创建一个新的公司company类。因此,在employee类中,该方法和属性被声明为静态类型最为合适。

我们需要注意:

  • 使用this无法引用使用static定义的成员变量。
  • 如果使用static修饰类,那么这个类的所有成员皆是静态的。
  • 类和静态类可以包含静态构造函数,静态的构造函数会在程序启动到实例化类之间调用。

一个实例

我们将员工类实现,如下:

 
  1. namespace J5
  2. {
  3. public class Emlployee {
  4. public string name; //员工属性:姓名
  5. public Emlployee(string name) {
  6. this.name = name;
  7. }
  8. public static int employeeNum; //非员工属性:员工数量
  9. public static void updateEmployeeNum() {
  10. employeeNum++;
  11. }
  12. }
  13. public class myCaller {
  14. public static void Main(string[] args) {
  15. Console.Write("Enter the new employee's name:");
  16. string name = Console.ReadLine();
  17. Emlployee e = new Emlployee(name);
  18. Console.Write("Enter the current number of employee:");
  19. string num = Console.ReadLine();
  20. Emlployee.employeeNum = Convert.ToInt32(num);//获取并更新员工数量
  21. Emlployee.updateEmployeeNum();
  22. Console.WriteLine("Name:"+e.name);
  23. Console.WriteLine("Number of Employee:"+Emlployee.employeeNum);
  24. }
  25. }
  26. }

该实例读取一个新员工对象姓名,然后通过函数updateEmployeeNum()对员工数加一更新员工数量,之终显示员工数量的最新状态。此段代码使用键盘输入员工名字及员工数量初始值。

运行结果如下:

特别实例

此段代码显示了静态变量之间赋值过程:

 
  1. namespace J5
  2. {
  3. class Test {
  4. static int x = y;
  5. static int y = 4;
  6. public static void Main() {
  7. Console.WriteLine(x);
  8. Console.WriteLine(y);
  9. x = 100;
  10. Console.WriteLine(x);
  11. Console.WriteLine(y);
  12. }
  13. }
  14. }

其中静态变量x声明的初始值为未定义变量y,运行结果如下:

结果表明,当变量x未被显示赋值之前,其值是未定义的。

编程要求

本关的编程任务是补全右侧代码片段中BeginEnd中间的代码,具体要求如下:

  • 补全大型活动类BigEvent,使用static关键字定义一个int类型静态变量counter,使之随着BigEvent类实例对象的创建而自增。
  • 程序运行正常,实际输出与测试中的预期输出相符。

测试说明

测试过程:

  • 平台将编译用户补全后的代码,并根据程序的输出判断程序是否正确。

以下是测试样例:

测试输入: 预期输出: 3


以中有足乐者,不知口体之奉不若人也。 --宋濂 开始你的任务吧,祝你成功!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace J5
{
    public class BigEvent
    {
        private string time;
        private string location;
        /********** Begin *********/
        public static int counter=0;
        public BigEvent()
        {
            counter++;
        }
        /********** End *********/
    }

    public class myCaller
    {
        public static void Main(string[] args)
        {
            BigEvent b1 = new BigEvent();
            BigEvent b2 = new BigEvent();
            BigEvent b3 = new BigEvent();

            Console.WriteLine(BigEvent.counter);
        }
    }
}

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桂亭亭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值