同福

编程入门第八课,对象(class)【20200918】

介绍

介绍

福哥今天给大家讲的是入门课里的最后一堂课,也是编程里的精髓——对象(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;
}

dd478f9c17a0b3d8.jpg

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();
        }
    }
}

cce84a74f0a5de4b.jpg

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();

cef7f305ef01ba25.jpg

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()

c32456439cef3a83.jpg

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();

2ec507ab2533fe12.jpg

作用域

对象的作用域和函数一样,在对象内部是一个独立的作用域,内外都是完全隔绝的。

对象的每个函数(对象方法)也会是一个独立的作用域,不过对象的每个属性针对对象的每个函数又都是共享的

对象的属性的共享特性就好像人的身体是一个整体,走路可以用到脚,跳跃也可以用到脚,吃东西需要用到嘴,喝东西也需要用到嘴

OOP

OOP就是Object Oriented Programming的简写,即面向对象编程。

面向对象编程需要具备一个能力,可以将项目当中的各种元素转化为抽象的对象模型,如果没有这个能力,是无法编写出基于OOP思想的对象编程代码的,如果不能掌握OOP思想,就很难做出大型的项目

很多人从事编程多年,仍无法领悟OOP思想的精髓,因此一直无法参与高端开发工作,无法成为高级工程师,这个会成为工程师晋级的一个瓶颈

总结

OOP是需要不断地参与各种项目开发的过程中,通过实践积累经验,才能逐步提高的

如果你喜欢编程,如果你领会了OOP的思想,那么恭喜你,你会写出非常漂亮的的代码,你可以做出功能非常强大的程序,你会成为领导者