(教学思路 c#之类一)声明类和对象、定义类成员及其引用

        上一节(教学思路 c#之面向对象二)初步理解面向对象的基本概念中,我没有提到任何的代码,只是用语言和实例来说明什么是类和对象以及面向对象的特性等基本概念,类是c#程序语言的重要核心,也是构建应用程序最主要的元素,在.net类库中,提供了大量支持创建各种应用程序功能的相关类,类是一个庞大的内容,我要分成两节来讲解,本节课我要教同学们如何声明类、对象以及定义类成员,针对类本身的组成与对象关系,进行详细的说明,下节课我们会深入的学习类。

        首先让我们回忆一下上节课说过的一些概念,什么是类?什么是对象呢?类就是具有相同的属性和功能的对象的抽象的集合,而对象呢?就是这个类中的一个实体,属于一个类的对象,必须包含共同的特征,而对象之间又因为各自的特性和行为的不同区分。用我听过的一个笑话来解释一下上面我说过的话,比如说人类是一个类,那么一个身高1米的孩子,和2米24的姚明站在一起,我们一定会说都是人,孩子和姚明就是人这个类的两个对象,我们不能说,因为孩子身高太矮,就把他说成是猴子,身高、姓名、性别、篮球打得怎么样等特性就是区别这两个对象的要素。

          这是现实生活中的实例,我现在用个程序用的实例来说明一下类和对象,在面向对象的领域里,类是用来封装应用程序的功能和逻辑的。比如我们以后会学习的一章文件、目录的操作中,将使用Dir类,Dir是目录的意思,那么Dir类就是对目录进行的管理和维护的操作类,也就是说,只要对目录进行操作,都应该使用Dir类的一个对象,让这个对象来做你想要做的工作,比如让一个dir类的对象创建一个目录,再用这个对象来删除目录,同时我们还可以创建多个Dir类的对象,来做工作,这时我们就需要考虑,如果是对同一个目录进行操作,创建过多的对象会造成资源上的浪费,所以同学们在以后的编程中要记得尽可能的简化程序。

          我们在编程过程中.Net类库会提供很多实现功能的类,比如刚才提到的Dir类,还有我们经常用到负责数据输出到控制台所使用的Console类,我们可以直接用,但是如果我们需要自己定义类时,比如将来我们要做一个企业网站,在实现后台操作时,我们可以把对新闻的增加、删除、修改、查找都定义在一个News类中,把对图片的操作定义在另一个Pictures类中比如限制上传图片的类型、大小等,这样当你想对新闻做操作时,就使用News类的一个对象来工作,如果想对图片做操作,就用Pictures类的一个对象来做工作,日后如果想修改维护网站时,你想修改新闻功能,你只需要修改News类即可,不会影响图片的功能,这就是类的一个好处,也就是面向对象的一个特性:封装性。通过这两个实例,我们基本上应该理解了类和对象的概念,下面我们来学习如何创建一个类,同时声明一个类的实例,也就是类的一个对象。

        定义类


 

       定义类的基本语法形式为:([]内的可以省略,如省略代表修饰符即为默认值)

      [访问修饰符/类修饰符]  Class  ClassName  [:Class-base]

        {

            Class -body;

         }

        其中[类修饰符]中包括访问修饰符和new、abstract、sealed这三种,[访问修饰符] 我们上节课学习过,是用来界定这个类允许以何种级别访问,其他这三种我们在本节课也将学习到,接着看类的定义,紧跟修饰符的是Class关键字和一个用来命名该类的标识符,[:Class-base]定义此类所继承的基类或实现的接口,这部分我们也会在以后学习到,这里不做过多的解释,大家只要知道,如果省略的话,代表这个类没有除了继承了Object类外,没有其他父类或接口,这里提到了Object类,Object类是所以类的父类,这里涉及到了C#底层设计,比较难理解,也与我们实际开发暂无太大联系,可以不考虑。接下来的“{}”中封装了类的主体,Class -body中包含类中所有的相关成员,它可以包括数据成员(字段、常量)、函数成员(方法、属性、事件、索引器、运算符、实例构造函数、析构函数和静态构造函数)和嵌套类。这些成员我们依次都会学到,先来说说嵌套类,它只的意思是类中还可以有类,大家先这样理解就可以了,具体嵌套的类有哪些特性,我们一会也会讲到。

       下来看看下面的代码实例,我们来定义一个类军人Armyman类,类中有3中成员,常量、字段、方法。

ContractedBlock.gifExpandedBlockStart.gif类的声明
 1None.gif //定义一个军人类,军人类的标识符为Armyman,默认缺省访问修饰符为private,除了Object类外,没有继承其他类
 2None.gif    class Armyman
 3ExpandedBlockStart.gifContractedBlock.gif    dot.gif{
 4InBlock.gif        //定义了一个军人国籍的常量为中国,访问修饰符是公有的。
 5InBlock.gif      public  const string country = "中国";
 6InBlock.gif      //定义了一个军人姓名的字段,访问修饰符是公有的。
 7InBlock.gif      public  string ArmymanName="";
 8InBlock.gif        //定义了一个军种字段,我们将要在后面的实例中将这个字段和下面的方法变成属性
 9InBlock.gif        string Armytype="";
10InBlock.gif        //定义了一个军种功能的方法,传递了军种的参数到方法内部,通过对军种的不同的判断,输出不同的功能。下面的判断最好使用swicth语句!
11InBlock.gif      public  void ArmyFunction(string Armytype)
12ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
13InBlock.gif            if (Armytype == "陆军")
14InBlock.gif                Console.WriteLine("现代陆军都是大规模的机械化部队,拥有大量的重装备和后勤补给。");
15InBlock.gif            if (Armytype == "海军")
16InBlock.gif                Console.WriteLine("杜鲁门曾说过:海军到哪里,国家的权利就到哪里 .");
17InBlock.gif            if (Armytype == "空军")
18InBlock.gif                Console.WriteLine("战略空军将使战争形态向可控战争转变。");
19InBlock.gif            else
20InBlock.gif                Console.WriteLine("{0}不是兵种,请输入现代战争中的三大兵种!海军、陆军、空军",Armytype");
21ExpandedSubBlockEnd.gif        }
    
22ExpandedBlockEnd.gif    }

     解释一下上面的这段代码类成员,首先定义了一个常量,常量的定义是使用const关键字,而且定义的同时必须赋值。常量就是在程序中永远不能改变的数据,必须通过类的名字进行引用,如果我们定义了一个常量,并且赋给常量一个值,那么想改变这个常量的值时,编译器便会报错。其他两种成员通过注释已经很清楚了,在这里我就不解释了,我们看一下访问修饰符,当一个成员没有加修饰符时,默认为private,即私有的成员。上节课我们学到当一个成员定义为private时,只有类的内部成员可以使用它,我们在这个例子中有一个成员没有加public修饰符 ,目的就是为了下面的实例在创建对象的时候 ,体会到如果是private成员,定义后,在这个类的外部是无法访问的,而public成员可以访问到。类的定义我们就先说到这,接下来我们来看类实例及成员引用。

        类实例及成员引用


 

        当我们创建完一个类,如果要使用这个类,必须在程序里创建类的实例对象,通过这个实例来引用类中所定义的方法成员,完成所需的工作。创建实例对象时,必须使用new关键字,这个关键字我们在集合和哈希表对象的创建时用到过,基本方法一致,就是用new关键字产生一个指向类实例对象所在位置的引用。实例化类对象的基本语法为:

        ClassName ObjName=new ClassName([参数]);       

         类的名字       对象名                           是否有参数、多少个参数由类的构造函数决定,现在我们都使用无参数来创建对象

      new关键字用来创建真正的ClassName类的实例对象,并返回这个对象的引用,“=”运算符则将此对象的引用(在托管堆中的地址)指定给ObjName变量,也就是说ObjName中存放的指向托管堆中ClassName对象的地址,这个ObjName存放在线程堆栈中,当这段程序执行后,通过ObjName这个对象名称,便可以直接引用ClassName类所定义的成员。

我们现在来紧跟着上个例子创建一个军人类Armyman 的实例对象ASoldiers(士兵):

Armyman  ASoldiers=new Armyman();

    创建完成,如果想让这个士兵完成一些Armyman类中功能,就要使用运算符(.),比如ASoldiers.ArmymanName就可以给士兵起名字如图1,这个过程就叫做引用。2008121311092536.jpg

下面的实例我们来具体完成一下类的创建和声明对象以及对象的引用。

ContractedBlock.gifExpandedBlockStart.gif定义类、声明对象,引用类成员
 1None.gifusing System;
 2None.gifusing System.Collections.Generic;
 3None.gifusing System.Text;
 4None.gif
 5None.gifnamespace testcsharp
 6ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 7InBlock.gif  //定义一个军人类,军人类的标识符为Armyman,除了Object类外,没有继承其他类
 8InBlock.gif    class Armyman
 9ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
10InBlock.gif        //定义了一个军人国籍的常量为中国,访问修饰符是公有的。
11InBlock.gif        public const string country = "中国";
12InBlock.gif
13InBlock.gif        //定义了一个军人姓名的字段,访问修饰符是公有的。
14InBlock.gif        public string ArmymanName = "";
15InBlock.gif
16InBlock.gif        //定义了一个军种字段,我们将要后面的实例中将这个字段和下面的方法变成属性
17InBlock.gif       public  string Armytype = "";
18InBlock.gif
19InBlock.gif        //定义了一个军种功能的方法,传递了军种的参数到方法内部,通过对军种的不同的判断,输出不同的功能。
20InBlock.gif        public void ArmyFunction(string Armytype)
21ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
22InBlock.gif            switch (Armytype)
23ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
24InBlock.gif                case "陆军":
25InBlock.gif                    Console.WriteLine("现代陆军都是大规模的机械化部队,拥有大量的重装备和后勤补给。");
26InBlock.gif                    break;
27InBlock.gif                case "海军":
28InBlock.gif                    Console.WriteLine("杜鲁门曾说过:海军到哪里,国家的权利就到哪里 .");
29InBlock.gif                    break;
30InBlock.gif                case "空军":
31InBlock.gif                    Console.WriteLine("战略空军将使战争形态向可控战争转变。");
32InBlock.gif                    break;
33InBlock.gif                default :
34InBlock.gif             Console.WriteLine("{0}不是兵种,请输入现代战争中的三大兵种!海军、陆军、空军", Armytype);
35InBlock.gif                    break;
36InBlock.gif
37ExpandedSubBlockEnd.gif            }

38ExpandedSubBlockEnd.gif        }

39ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//* 我们补充定义了一个静态static的军种功能的方法,
40InBlock.gif         * 和上面的方法不同的是,无参、并且多了static,
41InBlock.gif         * 相同的是方法的标识符相同都是ArmyFunction,这就构成了方法的重载
42ExpandedSubBlockEnd.gif         * 另外使用了static关键字,使得这个方法不能通过对象来引用,而必须通过类名来引用*/

43InBlock.gif        public static void ArmyFunction()
44ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
45InBlock.gif            Console.WriteLine("无论什么军种,作用都是:保卫国家人民、捍卫国家尊严。");
46ExpandedSubBlockEnd.gif        }

47ExpandedSubBlockEnd.gif    }

48InBlock.gif    class Program
49ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
50InBlock.gif        //Main方法是程序的入口点,所以无论这个Program类放到哪里,程序都会从Main方法开始执行。
51InBlock.gif        static void Main(string[] args)
52ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
53InBlock.gif            //我们来创建一个军人类Armyman 的实例对象ASoldiers(士兵)
54InBlock.gif            Armyman ASoldiers = new Armyman();
55InBlock.gif            
56InBlock.gif            //我们来定义一个string类型的变量soldiercountry,接受国籍,并且把它打印出来。
57InBlock.gif            //因为国籍country是常量,必须通过类名进行引用,所以使用Armyman . 也就是类名.。
58InBlock.gif            //有因为在Armyman类中,常量country的修饰符是public,所以在Armyman类的外部是可以访问到的
59InBlock.gif            string soldiercountry = Armyman.country;
60InBlock.gif            Console.WriteLine("士兵的国籍是:"+soldiercountry );
61InBlock.gif            Console.WriteLine();
62InBlock.gif
63InBlock.gif  //我们来给这个士兵起个名字,叫“许三多”,因为ArmymanName军人姓名在Armyman类中是public的字段,
64InBlock.gif            //在Armyman类的外部可以访问到所以通过对象名.,来引用军人姓名。
65InBlock.gif            ASoldiers.ArmymanName = "许三多";
66InBlock.gif
67InBlock.gif
68InBlock.gif            //下面我们定义兵种,如果按照上一个例子中的第九行,Armytype的修饰符是默认缺省的private,
69InBlock.gif            //现在我们可以试一下,是用对象名点不出来的,也就是无法访问到。
70InBlock.gif            //图1就是Armytype的修饰符为private时,输入对象名ASoldiers和“.”后的截图,我们看是没有Armytype这个成员供对象引用的。
71InBlock.gif            //为了讲解属性的作用,我们来把Armyman类中的Armytype字段改成public公有的如第,现在Armytype成员就可以点出来。
72InBlock.gif            //我们给Armytype赋个"男性"这个值,并且打印出来。
73InBlock.gif            ASoldiers.Armytype = "男性";
74InBlock.gif            Console.WriteLine("士兵{0}的兵种是{1}",ASoldiers .ArmymanName,ASoldiers.Armytype);
75InBlock.gif            Console.WriteLine();
76InBlock.gif
77ExpandedSubBlockStart.gifContractedSubBlock.gif            /**//*很明显我们发现了对于Armytype类中的Armytype(兵种)字段,存在了一个漏洞,就是男性不是兵种的一种。
78ExpandedSubBlockEnd.gif             * 这时我们可以通过下面的方法弥补一下,也就是当我们输入兵种后,将兵种作为参数带到Armyman的ArmyFunction方法中进行判断,再输出兵种的功能。*/

79InBlock.gif            ASoldiers.ArmyFunction(ASoldiers.Armytype);
80InBlock.gif            Console.WriteLine();
81InBlock.gif
82InBlock.gif            ASoldiers.Armytype = "陆军";
83InBlock.gif            Console.WriteLine("士兵{0}的兵种是{1}", ASoldiers.ArmymanName, ASoldiers.Armytype);
84InBlock.gif            ASoldiers.ArmyFunction(ASoldiers.Armytype);
85InBlock.gif            Console.WriteLine();
86InBlock.gif            //这样就能阻止一部分的错误,但是这还不是最合理的,下节课我们将要教授同学们属性的使用,完全解决了这个问题。
87InBlock.gif
88InBlock.gif            //下面我们再来使用一下static修饰的ArmyFunction的重构方法,
89InBlock.gif            //这个重构的方法因为是static静态的,所以需要用类名引用
90InBlock.gif            Armyman.ArmyFunction();
91InBlock.gif
92ExpandedSubBlockEnd.gif        }

93ExpandedSubBlockEnd.gif    }

94InBlock.gif    
95ExpandedBlockEnd.gif}

      运行结果如下:

士兵的国籍是:中国

士兵许三多的兵种是男性

男性不是兵种,请输入现代战争中的三大兵种!海军、陆军、空军

士兵许三多的兵种是陆军
现代陆军都是大规模的机械化部队,拥有大量的重装备和后勤补给。

无论什么军种,作用都是:保卫国家人民、捍卫国家尊严。

      我们通过实例学习了声明类、创建类实例对象,以及类成员因为修饰符的部分,访问权限和引用方式也是不同,这里做个总结,当成员修饰符是public时,在第二方Program类中才能被访问到,如果类成员是常量const或是static静态的,需要用类名来引用,其他的类成员都是用对象名来引用。下面说一个static关键字,被static关键字修饰的类成员叫做静态成员,相对的没用static关键字修饰的统称为实例成员,被static关键字修饰的类叫做静态类,那么类还有哪些类型呢?除了静态类(含static)、实例类(不含static)还有两种类,分别是:抽象类和密封类,我会在系列教案思路的继承一中具体讲解类的分类的内容。下一节我们来继续上一个例子中提到的改善军种的功能,学习类二:属性 

       

转载于:https://www.cnblogs.com/wangfang224120999/archive/2008/12/11/1352433.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264452.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【springboot】之自动配置原理

使用springboot开发web应用是很方便,只需要引入相对应的GAV就可以使用对应的功能,springboot默认会帮我们配置好一些常用配置。那么springboot是怎么做到的呢?这篇文章将一步步跟踪源码,查看springboot到底是如何帮我们做自动化配置。 sprin…

阴雨连绵潮湿加剧 车辆防潮提升保值

近日来,申城阴雨绵绵,不但增加了行车的难度,也使爱车潮气严重,开上一会就会发现前车窗布满水汽,需要开空调吹干才能保证良好视野。此外潮气也容易对人体和车辆本身造成影响,首当其冲的是车内电器&#xff0…

php nsdata,iOS开发之数据存储之NSData

1、概述使用archiveRootObject:toFile:方法可以将一个对象直接写入到一个文件中,但有时候可能想将多个对象写入到同一个文件中,那么就要使用NSData来进行归档对象。NSData可以为一些数据提供临时存储空间,以便随后写入文件,或者存…

asp.net控件开发基础(19)

上两篇讨论了基本数据绑定控件的实现步骤,基本上我们按着步骤来就可以做出简单的数据绑定控件了。过年前在看DataGrid的实现,本来想写这个的,但2.0出了GridView了,再说表格控件实现比较复杂,所以先放着。我们一起打开M…

1048 Find Coins

水题&#xff0c;详见代码&#xff5e; #include <iostream> #include <string.h> #include <cstdio> #include <algorithm> #include <cstdlib> #include <math.h> #include <queue> #include <stack> #include <vector&g…

php组件是啥,浅谈PHP组件、框架以及Composer

本篇文章主要介绍了PHP组件、框架以及Composer&#xff0c;具有一定的学习价值&#xff0c;感兴趣的朋友可以了解一下。什么是组件组件是一组打包的代码&#xff0c;是一系列相关的类、接口和Trait&#xff0c;用于帮助我们解决PHP应用中某个具体问题。例如&#xff0c;你的PHP…

{转}maven+continuum安装与配置

为什么80%的码农都做不了架构师&#xff1f;>>> 一、下载 1. maven: 项目管理工具&#xff0c;可以进行项目的编译、测试、布置、发布等 下载路径&#xff1a;http://apache.etoak.com/maven/binaries/apache-maven-2.2.1-bin.zip 2. continuum: 基本实现的功能&…

.net Excel导出出现乱码及excel打开出现错误提示

测试人员测试发现。导出excel出现乱码以及出现文件可正常导出、后几次导出却异常。 使用的系统浏览器&#xff1a; 其他360浏览器、谷歌浏览器均正常。 出现情况如下&#xff1a; 查资料发现&#xff0c;之前导出代码编写的 Response.AppendHeader("Content-Disposition&q…

rsync推拉模型及结合inotify实现推模型自动同步

一、前言 无论使用什么操作系统下&#xff0c;都经常有同步文件的需求&#xff0c;不管发生在本地&#xff0c;还是发生在本地和远程主机之间。那么应该怎么做呢&#xff1f; 使用拷贝类的命令&#xff0c;本地使用cp命令&#xff0c;复制到远程主机使用scp这样的命令&#xff…

oracle to pgsql,PostgresToOracle

PostgresToOracle官方版是一款十分专业和实用的PostgreSQL数据库迁移到Oracle工具&#xff0c;PostgresToOracle官方版功能出色&#xff0c;操作便捷&#xff0c;能够轻松快捷的帮助大家将PostgreSQL数据导入到oracle数据中&#xff0c;导入之后可以进行数据编辑&#xff0c;此…

Struts2中的OGNL详解

2019独角兽企业重金招聘Python工程师标准>>> 首先了解下OGNL的概念&#xff1a; OGNL是Object-Graph Navigation Language的缩写&#xff0c;全称为对象图导航语言&#xff0c;是一种功能强大的表达式语言&#xff0c;它通过简单一致的语法&#xff0c;可以任意存取…

C# 之 HttpResponse 类

Response 对象&#xff0c;派生自HttpResponse 类&#xff0c;该类封装来自 ASP.NET 操作的 HTTP 响应信息。存在于System.Web命名空间下。 注&#xff1a;MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型就是设定某种扩展名的文件用一种应用程序来打开的…

11个实用的CSS学习工具

为什么80%的码农都做不了架构师&#xff1f;>>> 1. 盒子模型的幻灯片 通过3D转换效果产生的互动的幻灯片。按向左或向右箭头键切换&#xff0c;全屏观看会有更好的效果。 2. CSS Diner 通过一个简单的小游戏让你学习CSS selector&#xff0c;输入正确的selector来完…

Google 节日徽标全集 (1999-2009) (下)

这是 Google 节日徽标全集的第三部分&#xff0c;也是最后一部分&#xff0c;包含 Google 2006 至 2009 年 2 月全部节日徽标。需要指出的是&#xff0c;这些徽标均来自 Google 国际站点&#xff0c;也就是 www.google.com&#xff0c;Google 在众多本地站点上还有大量本土化的…

HBuilder:最快的Web开发IDE

HBuilder&#xff1a;最快的Web开发IDE http://www.csdn.net/article/2014-02-07/2818326-HBuilder-the-fastest-web-ide发表于2014-02-11 10:38| 26194次阅读| 来源CSDN| 59 条评论| 作者CSDN移动前端开发HBuilder数字天堂王安Web开发HTML5DCloud摘要&#xff1a;HBuilder是DC…

Pycharm 项目无法导入自己写的模块(问题记录贴)

问题&#xff1a; 从外部导入一个Python项目后&#xff0c;发现包错误&#xff0c;如图&#xff1a; 解决步骤&#xff1a; 1.将目录下的"5-6——apriori.py"复制一份&#xff0c;重命名为”apriori.py"&#xff1b; 2.查资料知&#xff0c;pycharm不会将当前文…

Win2000/XP/2003路由制作之Nat共享上网

Win2000/XP/2003&#xff08;必须SERVER&#xff08;服务&#xff09;版本的&#xff09;ROUTEROS不会或则你的路由器突然坏了。紧急情况下&#xff0c;为了让老板的网吧正常营业&#xff0c;随手找个电脑就可以正常工作了。好吧。言归正传。NAT服务器软硬件准备俗话说“巧妇难…

Linux中的Interrupted system call错误

2019独角兽企业重金招聘Python工程师标准>>> 最近公司的一个项目&#xff0c;上线时候遇到了一些问题&#xff0c;服务跑一段时间后连接不上。 发现报了Interrupted system call这个错误引起的。 查了下资料&#xff0c;大致原因是系统繁忙处理不过来导致的。 根据网…

JAVA格式化当前日期或者取年月日

Date d new Date(); System.out.println(d); SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateNowStr sdf.format(d); System.out.println("格式化后的日期&#xff1a;" dateNowStr); 转载于:https://www.cnblo…

ubuntu查看硬件信息

ubuntu查看硬件信息 1,外部探针probe sudo apt-get install hwinfo 执行hwinfo获取系统信息 --short 2,系统命令dmidecode(硬件信息) or dmesg(主要是开机信息) 基于命令ubuntu 系统硬件信息查看 主板信息,序列号,产品名 dmesg | grep -i cpu dmidecode -t processor 硬盘(分区…