1. 介紹
1.1 介紹
福哥今天給大家講的是入門課里的最后一堂課球凰,也是編程里的精髓——對象(class)
在c語言年代里沒有對象(class)這個結構體虐沥,所以使用c語言開發(fā)的程序不會太過復雜,在大型項目當中脏榆,眾多模塊(module)之間都會出現大量的同名函數猖毫,為了避免這些函數的名稱沖突,都會用非常長的函數名稱须喂,即:
returnValue moduleName_functionName (arguments)
這樣的命名方式是很不方便的吁断,首先的問題就是函數名稱太長了,寫起來非常的麻煩坞生,閱讀起來也是很不方便仔役;其次就是函數都是獨立的,我們不得不人為的把它們湊到一起恨胚,如果漏掉了一個骂因,就麻煩了;還有就是無法為模塊定義獨有的屬性赃泡,沒有一個共享內存空間寒波,無法實現同一模塊的不同實例的效果
后來的c++語言實現了對象(class)這個結構體,所有上面的一切問題都迎刃而解了升熊。我們可以定義一個對象(class)俄烁,這個對象擁有獨立的屬性(property)組和函數(method)組(在對象里稱為方法);對象可以被實例(instance)化级野,實例化的對象擁有獨立的共享內存空間页屠;對象實例化后可以做為一個普通變量來使用,可以幫助工程師設計更為復雜的模塊,開發(fā)更為大型的項目
2. 對象語法
對象是一個抽象的概念辰企,世間萬物都可以化為一個對象风纠,首先無論是人還是物都會有一個名字,這個可以用對象名稱(class name)表示牢贸;無論是人還是物都會有很多特征(屬性)竹观,這個可以用對象屬性(class property)表示;人或物會有一些能力潜索,可以做一些事情臭增,這個可以用對象方法(class method)表示;那么對象名稱竹习、對象屬性誊抛、對象方法就是一個對象的三要素,對象實例(instance)化之后就可以描述一個具體的人或物整陌,每個人的人體構造都是一樣的拗窃,但是每個人的性格是千差萬別的,長相也是不盡相同的蔓榄,這些特性和對象實例是一模一樣的
2.1 對象名稱
對象名稱就是對象的唯一ID并炮,對象名稱在整個程序里必須是唯一的
注意:命名空間可以實現相同對象名稱的設計,這個以后再講吧
2.2 對象屬性
對象屬性就是對象的特征甥郑,一個對象可以有無限多個屬性逃魄,每個屬性的名稱在對象內必須是唯一的
2.3 對象方法
對象方法就是對象的能力,一個對象可以有無限多個方法澜搅,每個方法的聲明在對象內必須是唯一的伍俘,相同名稱不同參數的方法稱為多態(tài)(polymorphism),在弱類型的語言里每個方法的名稱在對象內必須是唯一的勉躺,如:php語言
2.4 構造器
構造器是一個特殊的對象方法癌瘾,它沒有返回值,它的名稱和對象名稱完全一樣饵溅,它是對象的入口函數妨退,它會在對象實例化的時候自動執(zhí)行,它就是對象構造器
2.5 c/c++示例
class?programer?{
public:
????int?id;
????string?fullName;
????string?gender;
????int?age;
public:
????programer(int?id);
????void?setFullName(string?fullName);
????void?setGender(string?gender);
????void?setAge(int?age);
????void?printInfo();
};
programer::programer(int?id)?{
????this->id?=?id;
????fullName?=?"";
????gender?=?"";
????age?=?0;
}
void?programer::setFullName(string?fullName)?{
????this->fullName?=?fullName;
}
void?programer::setGender(string?gender)?{
????this->gender?=?gender;
}
void?programer::setAge(int?age)?{
????this->age?=?age;
}
void?programer::printInfo()?{
????cout?<<?endl;
????cout?<<?"("?<<?id?<<?")?程序員的信息"?<<?endl;
????cout?<<?"姓名:"?<<?fullName?<<?endl;
????cout?<<?"性別:"?<<?gender?<<?endl;
????cout?<<?"年齡:"?<<?age?<<?endl;
????cout?<<?endl;
}
int?main()
{
????programer?fuge(123);
????programer?student(321);
????fuge.setFullName("福哥");
????fuge.setGender("男");
????fuge.setAge(35);
????string?fullName,?gender;
????int?age;
????cout?<<?"請問你是誰蜕企?"?<<?endl;
????cin?>>?fullName;
????cout?<<?"請問你的性別"?<<?endl;
????cin?>>?gender;
????cout?<<?"請問你的年齡"?<<?endl;
????cin?>>?age;
????student.setFullName(fullName);
????student.setGender(gender);
????student.setAge(age);
????fuge.printInfo();
????student.printInfo();
????return?0;
}
2.6 java示例
class?programer?{
????private?Integer?id;
????private?String?fullName;
????private?String?gender;
????private?Integer?age;
????public?programer?(Integer?id){
????????this.id?=?id;
????????this.fullName?=?"";
????????this.gender?=?"";
????????this.age?=?0;
????}
????public?void?setFullName(String?fullName){
????????this.fullName?=?fullName;
????}
????public?void?setGender(String?gender){
????????this.gender?=?gender;
????}
????public?void?setAge(Integer?age){
????????this.age?=?age;
????}
????public?void?printInfo(){
????????System.out.println("");
????????System.out.println("("?+?id?+?")?程序員的信息");
????????System.out.println("姓名:"?+?fullName);
????????System.out.println("性別:"?+?gender);
????????System.out.println("年齡:"?+?age);
????????System.out.println("");
????}
}
public?class?TFJavaDemo{
????public?static?void?main(String[]?args){
????????programer?fuge?=?new?programer(123);
????????programer?student?=?new?programer(321);
????????fuge.setFullName("福哥");
????????fuge.setGender("男");
????????fuge.setAge(35);
????????String?fullName,?gender;
????????Integer?age;
????????byte[]?buff?=?new?byte[100];
????????int?rdLen;
????????try?{
????????????System.out.println("請問你是誰咬荷?");
????????????rdLen?=?System.in.read(buff);
????????????fullName?=?(new?String(buff,?0,?rdLen-2));
????????????System.out.println("請問你的性別");
????????????rdLen?=?System.in.read(buff);
????????????gender?=?(new?String(buff,0,rdLen-2));
????????????System.out.println("請問你的年齡");
????????????rdLen?=?System.in.read(buff);
????????????age?=?Integer.parseInt(new?String(buff,0,rdLen-2));
????????????student.setFullName(fullName);
????????????student.setGender(gender);
????????????student.setAge(age);
????????????fuge.printInfo();
????????????student.printInfo();
????????}
????????catch?(IOException?e){
????????????e.printStackTrace();
????????}
????}
}
2.7 php示例
class?programer?{
????private?$id;
????private?$fullName;
????private?$gender;
????private?$age;
????public?function?programer?($id){
????????$this->id?=?$id;
????????$this->fullName?=?"";
????????$this->gender?=?"";
????????$this->age?=?0;
????}
????public?function?setFullName($fullName){
????????$this->fullName?=?$fullName;
????}
????public?function?setGender($gender){
????????$this->gender?=?$gender;
????}
????public?function?setAge($age){
????????$this->age?=?$age;
????}
????public?function?printInfo(){
????????print?"\n";
????????print?"("?.?$this->id?.?")?程序員的信息\n";
????????print?"姓名:"?.?$this->fullName?.?"\n";
????????print?"性別:"?.?$this->gender?.?"\n";
????????print?"年齡:"?.?$this->age?.?"\n";
????????print?"\n";
????}
}
$fuge?=?new?programer(123);
$student?=?new?programer(321);
$fuge->setFullName("福哥");
$fuge->setGender("男");
$fuge->setAge(35);
$fo?=?fopen("php://stdin",?"r");
print?"請問你是誰?\n";
$fullName?=?fgets($fo,?100);
$fullName?=?substr($fullName,?0,?strlen($fullName)-2);
print?"請問你的性別\n";
$gender?=?fgets($fo,?100);
$gender?=?substr($gender,?0,?strlen($gender)-2);
print?"請問你的年齡\n";
$age?=?fgets($fo,?100);
$age?=?substr($age,?0,?strlen($age)-2);
$student->setFullName($fullName);
$student->setGender($gender);
$student->setAge($age);
$fuge->printInfo();
$student->printInfo();
3. 作用域
對象的作用域和函數一樣轻掩,在對象內部是一個獨立的作用域幸乒,內外都是完全隔絕的。
對象的每個函數(對象方法)也會是一個獨立的作用域唇牧,不過對象的每個屬性針對對象的每個函數又都是共享的
對象的屬性的共享特性就好像人的身體是一個整體罕扎,走路可以用到腳聚唐,跳躍也可以用到腳,吃東西需要用到嘴腔召,喝東西也需要用到嘴
4. OOP
OOP就是Object Oriented Programming的簡寫杆查,即面向對象編程。
面向對象編程需要具備一個能力宴咧,可以將項目當中的各種元素轉化為抽象的對象模型根灯,如果沒有這個能力,是無法編寫出基于OOP思想的對象編程代碼的掺栅,如果不能掌握OOP思想,就很難做出大型的項目
很多人從事編程多年纳猪,仍無法領悟OOP思想的精髓氧卧,因此一直無法參與高端開發(fā)工作,無法成為高級工程師氏堤,這個會成為工程師晉級的一個瓶頸
5. 總結
OOP是需要不斷地參與各種項目開發(fā)的過程中沙绝,通過實踐積累經驗,才能逐步提高的
如果你喜歡編程鼠锈,如果你領會了OOP的思想闪檬,那么恭喜你,你會寫出非常漂亮的的代碼购笆,你可以做出功能非常強大的程序粗悯,你會成為領導者
【20200918】編程入門第八課,對象(class) 第 1 頁 - 鬼谷子叔叔的主頁 - 同福網 - TONGFU.net