1. 介绍
1.1 介绍
福哥今天给大家讲的是入门课里的最后一堂课,也是编程里的精髓——对象(class)
在c语言年代里没有对象(class)这个结构体,所以使用c语言开发的程序不会太过复杂,在大型项目当中,众多模块(module)之间都会出现大量的同名函数,为了避免这些函数的名称冲突,都会用非常长的函数名称,即:
returnValue moduleName_functionName (arguments)
这样的命名方式是很不方便的,首先的问题就是函数名称太长了,写起来非常的麻烦,阅读起来也是很不方便;其次就是函数都是独立的,我们不得不人为的把它们凑到一起,如果漏掉了一个,就麻烦了;还有就是无法为模块定义独有的属性,没有一个共享内存空间,无法实现同一模块的不同实例的效果
后来的c++语言实现了对象(class)这个结构体,所有上面的一切问题都迎刃而解了。我们可以定义一个对象(class),这个对象拥有独立的属性(property)组和函数(method)组(在对象里称为方法);对象可以被实例(instance)化,实例化的对象拥有独立的共享内存空间;对象实例化后可以做为一个普通变量来使用,可以帮助工程师设计更为复杂的模块,开发更为大型的项目
2. 对象语法
对象是一个抽象的概念,世间万物都可以化为一个对象,首先无论是人还是物都会有一个名字,这个可以用对象名称(class name)表示;无论是人还是物都会有很多特征(属性),这个可以用对象属性(class property)表示;人或物会有一些能力,可以做一些事情,这个可以用对象方法(class method)表示;那么对象名称、对象属性、对象方法就是一个对象的三要素,对象实例(instance)化之后就可以描述一个具体的人或物,每个人的人体构造都是一样的,但是每个人的性格是千差万别的,长相也是不尽相同的,这些特性和对象实例是一模一样的
2.1 对象名称
对象名称就是对象的唯一ID,对象名称在整个程序里必须是唯一的
注意:命名空间可以实现相同对象名称的设计,这个以后再讲吧
2.2 对象属性
对象属性就是对象的特征,一个对象可以有无限多个属性,每个属性的名称在对象内必须是唯一的
2.3 对象方法
对象方法就是对象的能力,一个对象可以有无限多个方法,每个方法的声明在对象内必须是唯一的,相同名称不同参数的方法称为多态(polymorphism),在弱类型的语言里每个方法的名称在对象内必须是唯一的,如:php语言
2.4 构造器
构造器是一个特殊的对象方法,它没有返回值,它的名称和对象名称完全一样,它是对象的入口函数,它会在对象实例化的时候自动执行,它就是对象构造器
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思想的精髓,因此一直无法参与高端开发工作,无法成为高级工程师,这个会成为工程师晋级的一个瓶颈
5. 总结
OOP是需要不断地参与各种项目开发的过程中,通过实践积累经验,才能逐步提高的
如果你喜欢编程,如果你领会了OOP的思想,那么恭喜你,你会写出非常漂亮的的代码,你可以做出功能非常强大的程序,你会成为领导者
【20200918】编程入门第八课,对象(class) 第 1 页 - 鬼谷子叔叔的主页 - 同福网 - TONGFU.net