1.字段、屬性、方法、構造函數
字段:存儲數據
屬性:保護字段,對字段的取值和設值進行限定
方法:描述對象的行爲
構造函數:初始化對象(給對象的每一個屬性依次的賦值)
類中成員,若是不加訪問修飾符,默認都是private
給每個私有的字段都配備一個公有的屬性
屬性的本質就是兩個方法html
當咱們建立好對象後
給這個對象的屬性賦值用set
打印這個屬性的值的時候執行get
this:當前類的對象
this:調用當前類
this是把屬性和局部變量區分開來的。
構造函數:一、沒有返回值 連void也沒有
二、構造函數的名稱跟類名同樣數組
構造函數能夠重載
:this(name,0,0,gender)less
new:一、在內存中開闢一塊空間
二、在開闢的空間建立對象
三、調用對象的構造函數 函數
限定:set get 構造函數post
靜態方法 類名.方法名
實例方法 對象名.方法名 ui
靜態方法只能訪問到靜態成員
靜態類不能建立對象
二、命名空間
命名空間能夠看作是類的文件夾
能夠認爲類是屬於命名空間的。
若是在當前項目中沒有這個類的命名空間,須要咱們手動的導入這個類所在的
命名空間。
1)、用鼠標去點
2)、alt+shift+F10
3)、記住命名空間,手動的去引用this
三、在一個項目中引用另外一個項目的類
1)、在解決方案資源管理器的引用右鍵添加引用
2)、引用命名空間url
三、值類型和引用類型
區別:
一、值類型和引用類型在內存上存儲的地方不同。
二、在傳遞值類型和傳遞引用類型的時候,傳遞的方式不同。
值類型咱們稱之爲值傳遞,引用類型咱們稱之爲引用傳遞。
咱們學的值類型和引用類型:
值類型:int、double、bool、char、decimal、struct、enum
引用類型:string、自定義類、數組
存儲:
值類型的值是存儲在內存的棧當中。
引用類型的值是存儲在內存的堆中。spa
堆、棧、靜態存儲區域pwa
int number=10; 在棧中開闢一個空間,在這個空間存儲10,給這個空間起名叫number
string s="123"; 在堆中開闢一個空間,在這個空間存儲"123",有一個地址(引用) 0x001001,
在棧中開闢一個空間,存堆中的地址0x001001,起名叫s。如今s是指向堆中的內存的
Person zsPerson=new Person();
zsPerson.Name="張三";
在堆中開闢空間,在這個空間存儲 new Person(); "張三",有一個地址(引用)
在棧中開闢一個空間,存堆中的地址,起名叫zsPerson
四、字符串
1)、字符串的不可變性
當你給一個字符串從新賦值以後,老值並無銷燬,而是從新開闢一塊空間存儲新值。
當程序結束後,GC掃描整個內存,若是發現有的空間沒有被指向,則當即把它銷燬。
int 從新賦值 會在原來的棧空間覆蓋原值
string 從新賦值,會在原來的堆空間從新開闢一個空間存新值。棧中存地址的空間不變
建立 string s1="張三"
string s2="張三"
只在堆中開闢一塊空間 存儲"張三"
在棧中開闢兩塊空間命名爲s1和s2指向堆中的空間(存儲堆中的地址)
我的解釋:
①當你建立了S1和S2後,就會在棧中開闢兩個空間
一個叫S1,內存地址是1000XX
一個叫S2,內存地址是2000XX
②你給S1,S2賦值的string 類型 "張三"
是存在堆中開闢的空間內
它也有個內存地址是XX0001
③你棧中的S1,S2空間存的是堆中 的內存地址XX0001,他們是同一個東西
④若是你再 S1="李四"
S2=「李四」
它們也只是把S1,S2裏面的內存地址指向堆中開闢的一個叫"李四"的空間的內存地址。
原來堆中存的"張三"不會有任何改變。
⑤當你清理內存的時候,那個"張三"由於內存地址沒有被引用過,就會被清理掉(垃圾回收)
窗口-即時-及時窗口-&s1 &s2 能夠看s1和s2的內存地址 上面是棧中的地址,下面是堆中的地址
2)、咱們能夠把字符串看作是char類型的一個只讀數組。
ToCharArray();將字符串轉換爲char數組
new string(char[] chs):可以將char數組轉換爲字符串
1 string s = "abcdefg"; 2 char[] chs = s.ToCharArray(); 3 chs[0] = 'b'; 4 s= new string(chs); 5 Console.WriteLine(s); 6 Console.ReadKey();
Stopwatch 計時器
Stopwatch sw=new Stopwatch();
sw.Start();開始計時
sw.Stop();中止計時
sw.elapsed 當前實例測量得出的總運行時間
StringBuilder sb=new StringBuilder();
sb.Append(i);追加
能把這個i累加到sb裏面
1 StringBuilder sb = new StringBuilder(); 2 //string str = null; 3 Stopwatch sw = new Stopwatch(); 4 sw.Start(); 5 for (int i = 0; i < 100000; i++) 6 { 7 //str += i; 8 sb.Append(i); 9 } 10 sw.Stop(); 11 Console.WriteLine(sw.Elapsed); 12 Console.ReadKey();
string 爲何這麼慢,由於它每次都要開空間
stringbuilder這麼快是由於它在內存中開空間,用來用去都是同一塊類型。
最後stringbuild仍是得要tostring轉爲string 類型。
五、字符串提供的各類方法
//把字符串轉爲大寫
LessonOne =LessonOne.ToUpper();
//把字符串轉爲小寫
LessonOne=LessonOne.ToLower();
//比較兩個字符串的值
LessonOne.Equals(LessonTwo,StringComparison.OrdinalIgnoreCase)
Equals一樣 StringComparison.OrdinalIgnoreCase 枚舉.忽略被比較的字符串的大小寫
string s = "a b c 3 12 - + _ , == fdf";
//分割字符串Split
//把不想要的字符都寫在char數組裏
//數組雖然幹掉了,可是仍是留了一個空""
//後面加上,StringSplitOptions.RemoveEmptyEntries把空給幹掉
char[] chs = { ' ','_','=','+',',','-'};
string[] str = s.Split(chs,StringSplitOptions.RemoveEmptyEntries);
Console.ReadKey();
練習
Console.WriteLine("請輸入日期,格式如2008-08-08"); string s = Console.ReadLine(); //能夠不用建立char []chs,直接把它New在裏面 string [] date= s.Split(new char [] {'-' },StringSplitOptions.RemoveEmptyEntries); Console.WriteLine("你輸入的日期是{0}年{1}月{2}日",date[0],date[1],date[2]); Console.ReadKey();
//contains(包括),判斷字符串中是否包含指定的字符串
//Replace(替換) 將字符串中某個字符串替換成一個新的字符串,返回
練習
1 string str = "國家領導人老趙"; 2 if(str.Contains("老趙")) 3 { 4 str=str.Replace("老趙","**"); 5 } 6 Console.WriteLine(str); 7 Console.ReadKey();
1 //Substring 截取字符串 2 string str = "今每天氣好晴朗,到處好風光"; 3 //把字符串當作數組,從下標0開始截取 4 str = str.Substring(1); 5 //從「天」開始截取,截取2個字 6 str = str.Substring(1,2); 7 Console.WriteLine(str); 8 Console.ReadKey();
1 //StartsWith()判斷字符串中是否以子串value開始 2 //EndsWith()判斷字符串中是否以子串value結束 3 //使用方式相同 4 string str = "今每天氣好晴朗,到處好風光"; 5 if(str.StartsWith("今天")) 6 { 7 Console.WriteLine("是的"); 8 } 9 else 10 { 11 Console.WriteLine("不是"); 12 } 13 Console.ReadKey();
1 //判斷某個字符串在字符串中第一次出現的下標位置,若是沒有返回-1,由int類型接受 2 string str = "今每天氣好晴朗,到處好風光"; 3 int n=str.IndexOf('天'); 4 //後面加個Int類型數字,表示找字符串中的第幾個‘天’的下標 5 //int n=str.IndexOf('天',2); 6 //若是要找到全部‘天’的下標,就須要用循環來找 7 Console.WriteLine(n); 8 Console.ReadKey();
1 //LastIndexOf():判斷某個字符串在字符串中最後一次出現的位置,若是沒有一樣返回-1 2 //LastIndexOf()常常和Substring配合使用 3 string path = @"c:\a\b\c\d\e\f\g\ff\蒼\ds\fgd\d\蒼老師.wav"; 4 //找最後一個斜線後出現的文字纔是最準確的,一直截到最後 5 int index=path.LastIndexOf("\\"); 兩個斜線表示一個斜線
練習
1 string path = @"c:\a\b\c\d\e\f\g\ff\蒼\ds\fgd\d\蒼老師.wav"; @表明字符串中的\都表示\ 2 int index = path.LastIndexOf("\\");字符串中\\表明一個\ 3 path=path.Substring(index+1); 截取是從\開始,因此要加1 4 Console.WriteLine(path); 5 Console.ReadKey();
1 //Trim():去掉字符串中先後的空格 2 //TrimEnd():去掉字符串中結尾的空格 3 //TrimStart():去掉字符串中前面的空格 4 string str = " hahaha "; 5 str=str.Trim(); 6 Console.Write(str); 7 Console.ReadKey();
1 //string.IsNullOrEmpty():判斷一個字符串是否爲空或者爲null 2 string str = null; 3 if(string.IsNullOrEmpty(str)) 4 { 5 Console.WriteLine("是的"); 6 } 7 else 8 { 9 Console.WriteLine("不是"); 10 } 11 Console.ReadKey();
1 //string.Join():將數組按照指定的字符串鏈接,返回一個字符串。 2 string[] name = { "張三","李四","王五","趙六","田七" }; 3 string str=string.Join("|", name); params可變參數:能夠放數組也能夠放參數 4 Console.WriteLine(str); 5 Console.ReadKey();
1)、Length:得到當前字符串中字符的個數
2)、ToUpper():將字符轉換成大寫形式
3)、ToLower():將字符串轉換成小寫形式
4)、Equals(lessonTwo,StringComparison.OrdinalIgnoreCase):比較兩個字符串,能夠忽略大小寫
5)、Split():分割字符串,返回字符串類型的數組。
6)、Substring():截取字符串。在截取的時候包含要截取的那個位置。
7)、IndexOf():判斷某個字符串在字符串中第一次出現的位置,若是沒有返回-一、值類型和引用類型在內存上存儲的地方不同。
8)、LastIndexOf():判斷某個字符串在字符串中最後一次出現的位置,若是沒有一樣返回-1
9)、StartsWith():判斷以....開始 bool類型判斷
10)、EndsWith():判斷以...結束 bool類型判斷
11)、Replace():將字符串中某個字符串替換成一個新的字符串
12)、Contains():判斷某個字符串是否包含指定的字符串 bool類型判斷
13)、Trim():去掉字符串中先後的空格
14)、TrimEnd():去掉字符串中結尾的空格
15)、TrimStart():去掉字符串中前面的空格
16)、string.IsNullOrEmpty():判斷一個字符串是否爲空或者爲null
17)、string.Join():將數組按照指定的字符串鏈接,返回一個字符串。
6.複習
字符串須要掌握的亮點
1)字符串不可變,每新建一個字符串都會在內存中開闢一塊新的空間
2)字符串的方法
StringBuilder和String的區別
String在進行運算時(如賦值、拼接等)會產生一個新的實例,而StringBuilder則不會。
使用StringBuilder進行操做,最後再用ToString轉爲String類型便可。
1 string path = @"C:\Users\SJD\Desktop\22.txt"; 路徑 2 string [] str= File.ReadAllLines(path,Encoding.Default); 3 //File(靜態類).ReadAllLines(方法,讀取全部的行)讀取的全是亂碼 4 //Encoding.Default 去除亂碼 5 Console.ReadKey();
7.練習
char類型數組轉爲string類型
1 char[]chs={‘1’,‘2’,‘3’}; 2 string str=new string(chs);
求出字符串中全部出現的e的位置
@第一種方法(必須會)
1 string str = "daghdewejhadgwehhjfhajejwwe"; 2 int index = str.IndexOf('e'); 3 Console.WriteLine("第1次出現e的位置是{0}", index); 4 int count = 1; 5 while (index != -1) 6 { 7 index = str.IndexOf('e', index + 1); 8 count += 1; 9 if (index == -1) 10 { 11 break; 12 } 13 Console.WriteLine("第{0}次出現e的位置是{1}", count, index); 14 } 15 Console.ReadKey();
第二種方法
查找多個字的話就不行
1 string str = "daghdewejhadgwehhjfhajejwwe"; 2 for (int i = 0; i < str.Length; i++) 3 { 4 if(str[i]=='e') 5 { 6 Console.WriteLine(i); 7 } 8 } 9 Console.ReadKey();
8.繼承
每個類都要單獨寫在一個類文件裏。
咱們可能會在一些類中,寫一些重複的成員,咱們能夠將這些重複的成員,
單獨的封裝到一個類中,做爲這些類的父類。
格式 子類:父類
Student、Teacher、Driver 子類 派生類
Person 父類 基類
子類繼承了父類,那麼子類從父類那裏繼承過來了什麼?
首先,子類繼承了父類的屬性和方法,可是子類並無繼承父類的私有字段。能看到也不能用
李一個有錢親戚掛了,受益人是李,可是沒有給他銀行密碼。他繼承過來了卻用不了。
問題:子類有沒有繼承父類的構造函數?
答:子類並無繼承父類的構造函數,可是。子類會默認的調用父類無參數的構造函數,
建立父類對象,讓子類可使用父類中的成員。
因此,若是在父類中從新寫了一個有參數的構造函數以後,那個無參數的就被幹掉了,
子類就調用不到了,因此子類會報錯。
執行完父類無參構造函數,再去執行子類的
執行父類的構造函數,就至關於建立一個父類的對象
由於沒有父類的對象,子類沒辦法用父類的屬性
建立子類對象的時候,也順便建立了他父類的對象,這樣才能用到父類的屬性和方法,成員
子類包含了本身的屬性和父類對象(構造函數),內部的父類又包含了他的屬性和方法
繼承構造函數的過程能夠加入子類的屬性
父類默認調用無參的而不是有參的
解決辦法:
1)、在父類中從新寫一個無參數的構造函數。
2)、在子類中顯示的調用父類的構造函數,使用關鍵字:base()
9.繼承的特性
一、繼承的單根性:一個子類只能有一個父類。
二、繼承的傳遞性:爺爺-爸爸-兒子-孫子
10.查看類圖
右鍵類文件-視圖-查看類圖 能夠看類之間的繼承關係
11.object是全部類的基類。
若是沒有讓一個類繼承於另一個類,那麼這個類就繼承於object
12.new關鍵字
1)、建立對象
2)、隱藏從父類那裏繼承過來的同名成員。
隱藏的後果就是子類調用不到父類的成員。
子類成員名稱和父類成員名稱相同,會隱藏繼承的父類成員,隱藏後果就是調不到了。
添加new後只是不報錯
13.複習值類型引用類型字符串 不可變性 一坨方法StringBuilder繼承 單根性 傳遞性 子類跟父類構造函數的關係 子類繼承了父類的什麼?new關鍵字