繼續更新。。。接下來就是面向對象的知識了
1、面向對象:概念:使用面向對象的思想進行編程可以讓的程序變得擴展性更高,便於維護;
我們在現實生活中去描述一個人的時候,通過描述這個人的特征和行為。
我們在編程當中,去描述一個對象的時候,通過描述這個對象的屬性和方法。
對象時具體的,不是抽象的,一定是看得見摸得著的。
我們把一些具有相同屬性和方法的對象進行進一步的抽象,提取出了"類"這個概念。
類就是模子,確定了對象將要擁有的屬性和方法。
2、類:
語法:
[訪問修飾符] class 類名
{
成員;
......
}
訪問修飾符:public,公開的,公共的,在哪都可以訪問
class:是我們聲明類的關鍵字
類名:要符合Pascal命名規范
成員:
字段、屬性、方法。
總結:
1)、我們在寫一個類的時候,需要在項目中新建一個類文件。
2)、在類中,默認的訪問修飾符是private,表示私有的,只能在當前類的內部訪問。
3)、在類中,我們現在可以寫3種成員,字段,屬性和方法
4)、我們寫好了一個類之後,需要創建這個類的對象,叫做類的實例化
5)、類是不占內存的,但是對象時占內存的。
6)、自定義類,屬於引用類型,我們的對象存儲在內存的堆中。
3、屬性:
1)、我們要求將類中所有的字段都標記為private,但是標記為private之後,類中的字段在外界沒有辦法被訪問。
2)、並沒有辦法對字段的非法值進行處理
屬性的出現解決了上面兩個問題:
語法:
[訪問修飾符] 屬性類型 屬性名
{
get{}
set{}
}
屬性的出現了保護了字段,對字段的取值和設置進行了限定。
1)、在賦值的時候進行判斷,也就是在set方法中
2)、在取值的時候進行判斷,也就是在get方法中
屬性中既有get也有set,我們叫做可讀可寫屬性。
只有get叫做只讀屬性,意味著我們只能給屬性取值,而不能對屬性賦值。
只有set叫做只寫屬性,意味著我們只能給屬性賦值,但是不能對屬性取值。
4:關於this關鍵字的含義:
1)、代表當前這個類的對象。
2)、顯示的調用本類的構造函數。
4.1:成員變量和局部變量
局部變量:方法中的成員都是局部變量。
成員變量:類中的變量
局部變量的作用域就是當前方法,而成員變量的作用域當前類。(上面的this很能說明這個)
小總結:
字段:存儲數據
屬性:保護字段,通過兩個方法 get、set
方法:描述這個對象的行為
字段跟屬性的關系:字段就是女人 屬性就是男人(男人一般在外打交道,女人嘛。。。你懂得)
5、構造函數:構造函數其實就是一個特殊的方法,用來初始化對象。
eg:[public] class Person
{
}
[public] Person()
{
}
特殊有二:
1)、構造函數的名稱跟類名一樣。
2)、構造函數沒有返回值。連void都沒有。
注:
在類中,如果你不指定其他的構造函數,則會默認有一個無參數的構造函數。
當你寫了一個新的構造函數後。不管這個新寫的構造函數有參數還是沒有參數,都會把原來那個
默認的無參數的構造函數干掉。
5.1關於new關鍵字的含義:
1)、在堆中開辟空間
2)、在開辟的堆空間中創建對象
3)、調用對象的構造函數進行初始化
4)、隱藏父類的成員
6、靜態和非靜態的區別
1)、被static標記的成員叫做靜態成員,沒有被static標記的成員叫做實例成員或者非靜態成員。
2)、在一個非靜態類中,既能出現靜態成員,也能出現非靜態成員。
3)、非靜態成員需要使用對象去調用,而靜態成員需要使用類名去調用。
4)、為什麼對象不能去調用靜態成員?
靜態成員是隨著程序的加載,就已經在內存中開辟空間的。
5)、靜態方法中只允許使用靜態成員,但是非靜態方法中既可以使用靜態成員也可以使用非靜態成員。
6)、靜態類中所有的成員都必須是靜態成員。
7)、靜態類不允許被創建對象,因為沒有實際意義
6.1:為什麼要使用靜態類?
1)、當這個類被用作工具類的時候,可以考慮寫成靜態類。
Console con=new Console();
con.WriteLine();
Console.WriteLine();
2)、靜態成員在整個項目中是資源共享的。
7、訪問修飾符
public:公開的公共的,在哪都可以訪問。
private:私有的,只能在當前類的內部訪問,出了這個類就訪問不到了
internal:表示只能在當前項目的內部進行訪問,出了這個項目就訪問不到了。
(總和5個訪問修飾符 基本上用這3個就夠了)
8、特殊的字符串
字符串對於我們而言是一個非常特殊的類型,特殊原因有二:
1)、字符串不可變性,我們每次對字符串重新賦值、拼接等操作,都會在內存中產生一個新的實例。
string s1="張三";
s1="李四";
2)、字符串可以看做是char類型的只讀數組
8.1:字符串常用的方法:
ToCharArray():將字符串轉換為char數組
new string(char[]):將char數組轉換為字符串
Length:獲得字符串的字符個數
ToUpper():將字符串轉換為大寫形式
ToLower():將字符串轉換為小寫形式
Equals():比較字符串,可以忽略字符串的大小寫
Split():可以把我們在字符串中不想要的字符都切割出去
9、面向對象的3大特征:
9.1、封裝:把程序當中重復出現的代碼封裝成了方法。(這個不用多說想必大家都已明白)
9.2、繼承:繼承可以解決類與類之間的冗余代碼。
我們把類當中,所共有的成員,單獨的封裝一個類。 讓其他類來繼承這個類。
例如寫了 Person 和 Student 2個類 ,Student類繼承了Person類,那麼我們管Student類稱之為子類或者派生類。管Person類叫做父類或者基類。
子類繼承了父類的屬性和方法,並沒有繼承父類的私有字段。
注:子類並沒有繼承父類的構造函數,但是,子類會默認的調用父類無參數的構造函數。
為什麼子類要去調用父類無參數的構造函數?
1)、我們可能會在父類無參數的構造函數當中對父類成員進行初始化
2)、因為子類需要使用父類的成員,需要創建父類的對象。
(如果我們在父類中新寫了一個構造函數,這個時候會干掉父類那個默認的無參數的構造函數)解決辦法:
1)、在父類中重新寫一個無參數的構造函數
2)、顯示的調用父類有參數的構造函數。使用關鍵字base
base跟this不一樣:base代表父類的引用;this代表的是該類的對象。
注:子類可以使用父類的成員,但是父類永遠只能使用自己的成員。
9.3、繼承的兩大特性:
1)、單根性:一個子類只能繼承自一個父類。
2)、傳遞性:父類中的成員,可以一代一代的向下傳遞。
10、裡氏轉換:
兩句話:
1、子類可以賦值給父類(如果有一個地方需要一個父類作為參數 我們可以傳遞一個子類)
eg:
class Person
{
public void PersonSayHello()
{
Console.WriteLine("我是父類");
}
}
class Student : Person
{
public void StudentSayHello()
{
Console.WriteLine("我是學生");
}
}
class Teacher : Person
{
public void TeacherSayHello()
{
Console.WriteLine("我是老師");
}
}
Student s = new Student();
Person p = new Student();
2、如果父類中裝的是子類對象,那麼可以將這個父類強值轉換為對應的子類對象
eg:
Student s = (Student)p;
s.StudentSayHello();
10.1、is和as:is 和 as都表示類型轉換。
is:如果轉換成功,返回true,否則返回false
eg:
Person p = new Student();
if (p is Student)
{
(Student)p).StudentSayHello();
}
else
{
Console.WriteLine("轉換失敗");
}
as:如果轉換成功,則返回對應的對象,否則返回null
eg:
Person p = new Student();
Student s = p as Student;
s.StudentSayHello();
Console.ReadKey();