(教学思路 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中成員,常量、字段、方法。
類的聲明?1?//定義一個軍人類,軍人類的標識符為Armyman,默認缺省訪問修飾符為private,除了Object類外,沒有繼承其他類
?2????class?Armyman
?3????{
?4????????//定義了一個軍人國籍的常量為中國,訪問修飾符是公有的。
?5??????public??const?string?country?=?"中國";
?6??????//定義了一個軍人姓名的字段,訪問修飾符是公有的。
?7??????public??string?ArmymanName="";
?8????????//定義了一個軍種字段,我們將要在后面的實例中將這個字段和下面的方法變成屬性
?9????????string?Armytype="";
10????????//定義了一個軍種功能的方法,傳遞了軍種的參數到方法內部,通過對軍種的不同的判斷,輸出不同的功能。下面的判斷最好使用swicth語句!
11??????public??void?ArmyFunction(string?Armytype)
12????????{
13????????????if?(Armytype?==?"陸軍")
14????????????????Console.WriteLine("現代陸軍都是大規模的機械化部隊,擁有大量的重裝備和后勤補給。");
15????????????if?(Armytype?==?"海軍")
16????????????????Console.WriteLine("杜魯門曾說過:海軍到哪里,國家的權利就到哪里?.");
17????????????if?(Armytype?==?"空軍")
18????????????????Console.WriteLine("戰略空軍將使戰爭形態向可控戰爭轉變。");
19????????????else
20????????????????Console.WriteLine("{0}不是兵種,請輸入現代戰爭中的三大兵種!海軍、陸軍、空軍",Armytype");
21????????}????
22????}
???? 解釋一下上面的這段代碼類成員,首先定義了一個常量,常量的定義是使用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,這個過程就叫做引用。
下面的實例我們來具體完成一下類的創建和聲明對象以及對象的引用。
定義類、聲明對象,引用類成員?1using?System;
?2using?System.Collections.Generic;
?3using?System.Text;
?4
?5namespace?testcsharp
?6{
?7? //定義一個軍人類,軍人類的標識符為Armyman,除了Object類外,沒有繼承其他類
?8????class?Armyman
?9????{
10????????//定義了一個軍人國籍的常量為中國,訪問修飾符是公有的。
11????????public?const?string?country?=?"中國";
12
13????????//定義了一個軍人姓名的字段,訪問修飾符是公有的。
14????????public?string?ArmymanName?=?"";
15
16????????//定義了一個軍種字段,我們將要后面的實例中將這個字段和下面的方法變成屬性
17???????public??string?Armytype?=?"";
18
19????????//定義了一個軍種功能的方法,傳遞了軍種的參數到方法內部,通過對軍種的不同的判斷,輸出不同的功能。
20????????public?void?ArmyFunction(string?Armytype)
21????????{
22????????????switch?(Armytype)
23????????????{
24????????????????case?"陸軍":
25????????????????????Console.WriteLine("現代陸軍都是大規模的機械化部隊,擁有大量的重裝備和后勤補給。");
26????????????????????break;
27????????????????case?"海軍":
28????????????????????Console.WriteLine("杜魯門曾說過:海軍到哪里,國家的權利就到哪里?.");
29????????????????????break;
30????????????????case?"空軍":
31????????????????????Console.WriteLine("戰略空軍將使戰爭形態向可控戰爭轉變。");
32????????????????????break;
33????????????????default?:
34?????????????Console.WriteLine("{0}不是兵種,請輸入現代戰爭中的三大兵種!海軍、陸軍、空軍",?Armytype);
35????????????????????break;
36
37????????????}
38????????}
39????????/**//*?我們補充定義了一個靜態static的軍種功能的方法,
40?????????*?和上面的方法不同的是,無參、并且多了static,
41?????????*?相同的是方法的標識符相同都是ArmyFunction,這就構成了方法的重載
42?????????*?另外使用了static關鍵字,使得這個方法不能通過對象來引用,而必須通過類名來引用*/
43????????public?static?void?ArmyFunction()
44????????{
45????????????Console.WriteLine("無論什么軍種,作用都是:保衛國家人民、捍衛國家尊嚴。");
46????????}
47????}
48????class?Program
49????{
50????????//Main方法是程序的入口點,所以無論這個Program類放到哪里,程序都會從Main方法開始執行。
51????????static?void?Main(string[]?args)
52????????{
53????????????//我們來創建一個軍人類Armyman?的實例對象ASoldiers(士兵)
54????????????Armyman?ASoldiers?=?new?Armyman();
55????????????
56????????????//我們來定義一個string類型的變量soldiercountry,接受國籍,并且把它打印出來。
57????????????//因為國籍country是常量,必須通過類名進行引用,所以使用Armyman?.?也就是類名.。
58????????????//有因為在Armyman類中,常量country的修飾符是public,所以在Armyman類的外部是可以訪問到的
59????????????string?soldiercountry?=?Armyman.country;
60????????????Console.WriteLine("士兵的國籍是:"+soldiercountry?);
61????????????Console.WriteLine();
62
63??//我們來給這個士兵起個名字,叫“許三多”,因為ArmymanName軍人姓名在Armyman類中是public的字段,
64????????????//在Armyman類的外部可以訪問到所以通過對象名.,來引用軍人姓名。
65????????????ASoldiers.ArmymanName?=?"許三多";
66
67
68????????????//下面我們定義兵種,如果按照上一個例子中的第九行,Armytype的修飾符是默認缺省的private,
69????????????//現在我們可以試一下,是用對象名點不出來的,也就是無法訪問到。
70????????????//圖1就是Armytype的修飾符為private時,輸入對象名ASoldiers和“.”后的截圖,我們看是沒有Armytype這個成員供對象引用的。
71????????????//為了講解屬性的作用,我們來把Armyman類中的Armytype字段改成public公有的如第,現在Armytype成員就可以點出來。
72????????????//我們給Armytype賦個"男性"這個值,并且打印出來。
73????????????ASoldiers.Armytype?=?"男性";
74????????????Console.WriteLine("士兵{0}的兵種是{1}",ASoldiers?.ArmymanName,ASoldiers.Armytype);
75????????????Console.WriteLine();
76
77????????????/**//*很明顯我們發現了對于Armytype類中的Armytype(兵種)字段,存在了一個漏洞,就是男性不是兵種的一種。
78?????????????*?這時我們可以通過下面的方法彌補一下,也就是當我們輸入兵種后,將兵種作為參數帶到Armyman的ArmyFunction方法中進行判斷,再輸出兵種的功能。*/
79????????????ASoldiers.ArmyFunction(ASoldiers.Armytype);
80????????????Console.WriteLine();
81
82????????????ASoldiers.Armytype?=?"陸軍";
83????????????Console.WriteLine("士兵{0}的兵種是{1}",?ASoldiers.ArmymanName,?ASoldiers.Armytype);
84????????????ASoldiers.ArmyFunction(ASoldiers.Armytype);
85????????????Console.WriteLine();
86????????????//這樣就能阻止一部分的錯誤,但是這還不是最合理的,下節課我們將要教授同學們屬性的使用,完全解決了這個問題。
87
88????????????//下面我們再來使用一下static修飾的ArmyFunction的重構方法,
89????????????//這個重構的方法因為是static靜態的,所以需要用類名引用
90????????????Armyman.ArmyFunction();
91
92????????}
93????}
94????
95}
????? 運行結果如下:
士兵的國籍是:中國
士兵許三多的兵種是男性
男性不是兵種,請輸入現代戰爭中的三大兵種!海軍、陸軍、空軍
士兵許三多的兵種是陸軍
現代陸軍都是大規模的機械化部隊,擁有大量的重裝備和后勤補給。
無論什么軍種,作用都是:保衛國家人民、捍衛國家尊嚴。
????? 我們通過實例學習了聲明類、創建類實例對象,以及類成員因為修飾符的部分,訪問權限和引用方式也是不同,這里做個總結,當成員修飾符是public時,在第二方Program類中才能被訪問到,如果類成員是常量const或是static靜態的,需要用類名來引用,其他的類成員都是用對象名來引用。下面說一個static關鍵字,被static關鍵字修飾的類成員叫做靜態成員,相對的沒用static關鍵字修飾的統稱為實例成員,被static關鍵字修飾的類叫做靜態類,那么類還有哪些類型呢?除了靜態類(含static)、實例類(不含static)還有兩種類,分別是:抽象類和密封類,我會在系列教案思路的繼承一中具體講解類的分類的內容。下一節我們來繼續上一個例子中提到的改善軍種的功能,學習類二:屬性。?
???????
轉載于:https://www.cnblogs.com/wangfang224120999/archive/2008/12/11/1352433.html
總結
以上是生活随笔為你收集整理的(教学思路 c#之类一)声明类和对象、定义类成员及其引用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对标国产宝马!蔚来ES7 8月28日起交
- 下一篇: B站回应HR称用户是Loser:涉事面试