介绍
介绍
福哥今天给大家讲的是入门课里的最后一堂课,也是编程里的精髓——对象(class)
在c语言年代里没有对象(class)这个结构体,所以使用c语言开发的程序不会太过复杂,在大型项目当中,众多模块(module)之间都会出现大量的同名函数,为了避免这些函数的名称冲突,都会用非常长的函数名称,即:
returnValue moduleName_functionName (arguments)
这样的命名方式是很不方便的,首先的问题就是函数名称太长了,写起来非常的麻烦,阅读起来也是很不方便;其次就是函数都是独立的,我们不得不人为的把它们凑到一起,如果漏掉了一个,就麻烦了;还有就是无法为模块定义独有的属性,没有一个共享内存空间,无法实现同一模块的不同实例的效果
后来的c++语言实现了对象(class)这个结构体,所有上面的一切问题都迎刃而解了。我们可以定义一个对象(class),这个对象拥有独立的属性(property)组和函数(method)组(在对象里称为方法);对象可以被实例(instance)化,实例化的对象拥有独立的共享内存空间;对象实例化后可以做为一个普通变量来使用,可以帮助工程师设计更为复杂的模块,开发更为大型的项目
对象语法
对象是一个抽象的概念,世间万物都可以化为一个对象,首先无论是人还是物都会有一个名字,这个可以用对象名称(class name)表示;无论是人还是物都会有很多特征(属性),这个可以用对象属性(class property)表示;人或物会有一些能力,可以做一些事情,这个可以用对象方法(class method)表示;那么对象名称、对象属性、对象方法就是一个对象的三要素,对象实例(instance)化之后就可以描述一个具体的人或物,每个人的人体构造都是一样的,但是每个人的性格是千差万别的,长相也是不尽相同的,这些特性和对象实例是一模一样的
对象名称
对象名称就是对象的唯一ID,对象名称在整个程序里必须是唯一的
注意:命名空间可以实现相同对象名称的设计,这个以后再讲吧
对象属性
对象属性就是对象的特征,一个对象可以有无限多个属性,每个属性的名称在对象内必须是唯一的
对象方法
对象方法就是对象的能力,一个对象可以有无限多个方法,每个方法的声明在对象内必须是唯一的,相同名称不同参数的方法称为多态(polymorphism),在弱类型的语言里每个方法的名称在对象内必须是唯一的,如:php语言
构造器
构造器是一个特殊的对象方法,它没有返回值,它的名称和对象名称完全一样,它是对象的入口函数,它会在对象实例化的时候自动执行,它就是对象构造器
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; }
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(); } } }
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();
python
import sys class programer: id=0 fullName="" gender="" age=0 def __init__(self, id): self.id = id self.fullName = "" self.gender = "" self.age = 0 def setFullName(self, fullName): self.fullName = fullName def setGender(self, gender): self.gender = gender def setAge(self, age): self.age = age def printInfo(self): print("") print("(" + str(self.id) + ") 程序员的信息") print("姓名:" + self.fullName) print("性别:" + self.gender) print("年龄:" + str(self.age)) print("") fuge = programer(123) student = programer(321) fuge.setFullName("福哥") fuge.setGender("男") fuge.setAge(35) print("请问你是谁?") fullName = sys.stdin.readline().strip() print("请问你的性别") gender = sys.stdin.readline().strip() print("请问你的年龄") age = sys.stdin.readline().strip() student.setFullName(fullName) student.setGender(gender) student.setAge(age) fuge.printInfo() student.printInfo()
javascript
javascript有两种实现OOP的方式,一种是通过function来实现,另外一种是通过prototype来实现。
function方式
function programer(id){ this.id=id; this.fullName=""; this.gender=""; this.age=0; this.init=function(id){ this.id = id; this.fullName = ""; this.gender = ""; this.age = 0; }; this.setFullName=function(fullName){ this.fullName = fullName; }; this.setGender=function(gender){ this.gender = gender; }; this.setAge=function(age){ this.age = age; }; this.printInfo=function(){ console.log(""); console.log("(" + this.id + ") 程序员的信息"); console.log("姓名:" + this.fullName); console.log("性别:" + this.gender); console.log("年龄:" + this.age); console.log(""); }; this.init(id); } var fuge = new programer(123); var student = new programer(321); fuge.setFullName("福哥"); fuge.setGender("男"); fuge.setAge(35); var fullName, gender, age; fullName = prompt("请问你是谁?"); gender = prompt("请问你的性别"); age = prompt("请问你的年龄"); student.setFullName(fullName); student.setGender(gender); student.setAge(age); fuge.printInfo(); student.printInfo();
prototype方式
var programer = { id:0, fullName:"", gender:"", age:0, init:function(id){ this.id = id; this.fullName = ""; this.gender = ""; this.age = 0; }, setFullName:function(fullName){ this.fullName = fullName; }, setGender:function(gender){ this.gender = gender; }, setAge:function(age){ this.age = age; }, printInfo:function(){ console.log(""); console.log("(" + this.id + ") 程序员的信息"); console.log("姓名:" + this.fullName); console.log("性别:" + this.gender); console.log("年龄:" + this.age); console.log(""); } } programer.init.prototype = programer; var fuge = new programer.init(123); var student = new programer.init(321); fuge.setFullName("福哥"); fuge.setGender("男"); fuge.setAge(35); var fullName, gender, age; fullName = prompt("请问你是谁?"); gender = prompt("请问你的性别"); age = prompt("请问你的年龄"); student.setFullName(fullName); student.setGender(gender); student.setAge(age); fuge.printInfo(); student.printInfo();
作用域
对象的作用域和函数一样,在对象内部是一个独立的作用域,内外都是完全隔绝的。
对象的每个函数(对象方法)也会是一个独立的作用域,不过对象的每个属性针对对象的每个函数又都是共享的
对象的属性的共享特性就好像人的身体是一个整体,走路可以用到脚,跳跃也可以用到脚,吃东西需要用到嘴,喝东西也需要用到嘴
OOP
OOP就是Object Oriented Programming的简写,即面向对象编程。
面向对象编程需要具备一个能力,可以将项目当中的各种元素转化为抽象的对象模型,如果没有这个能力,是无法编写出基于OOP思想的对象编程代码的,如果不能掌握OOP思想,就很难做出大型的项目
很多人从事编程多年,仍无法领悟OOP思想的精髓,因此一直无法参与高端开发工作,无法成为高级工程师,这个会成为工程师晋级的一个瓶颈
总结
OOP是需要不断地参与各种项目开发的过程中,通过实践积累经验,才能逐步提高的
如果你喜欢编程,如果你领会了OOP的思想,那么恭喜你,你会写出非常漂亮的的代码,你可以做出功能非常强大的程序,你会成为领导者