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

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

你可能感兴趣的:(【20200918】编程入门第八课,对象(class))