1面向对象的基本概念面向对象的三大特点:封装、继承和多态。一、类类表示通用的特性,类是一个事物抽象出来的结果。实际上,类就是一种用户定义的数据类型。假设有一个描述汽车的类其定义就是表示各种汽车通用特性。一般来说,一个类具有成员变量和成员方法两部分(其中成员变量在labview中称为“数据”,可以这么来理解:类的每个实例,即对象,具有状态,一个对象用数据值来描述它的状态。)。(1)成员变量相当于属性(属性指的是类中对象所具有的性质(数据值))。比如把人作为一个类的话,“人”具有的胳膊、手脚等就是成员变量。而把“汽车”作为一类的话,车门和排挡上的数据就是汽车类的数据。(2)成员方法是该类能完成的一些功能,比如‘人’可以说话(talk),行走(walk)等。汽车的启动、刹车功能就是“汽车”的方法。二、对象对象,如果说类是一个抽象概念,那么对象就是具体对象,对象是类的特定实例。类与对象的关系就如类型和变量的关系,所有对类的操作都必须通过对象来实现。比如我们说‘人’就是一个抽象概念,但是具体到某个人,比如你,我,他,就是一个‘人’对象。某一辆特定的汽车就是“汽车”类的一个对象。三、封装封装,是指每个对象都包含了它所能操作的所需的所有信息,简单理解就是把一系列的数据放在一个类中,对象是封装的最基本单位。还用前面的例子,如果形容一个人,我们可以用姓名(name)、身高(hight),体重(weight)等来描述,如果不封装,我们需要3个变量来形容它。在面向对象中,可以用一个Person类封装这些数据,Person具有3个成员变量,分别是name,height,weight。使用的时候,每当生成一个这样的类的对象,就具有这3个属性。Labview中的数据(常存放在控件.ctl中)只有私有封装形式,但成员VI(即方法)却可以有不同的封装形式,成员VI的访问设置权限如下:(1)公共(public):任何VI都可将该成员VI作为子VI来调用;(2)保护(protected):仅该成员VI所在的类及其子类中的VI可以调用;2(3)私有(private):只能被本类中的其他VI调用。四、继承继承,如果B类继承A类,那么B类将具有A类的全部属性和方法,同时还可以扩展自己独有的方法和属性。还用人做例子。‘人’是父类,那么‘男人’,‘女人’都是继承自‘人’。也就是说,不论‘男人’,‘女人’,都具有‘身高’,‘体重’这两个属性,同时,他们可以有自己独有的属性,比如‘女人’可以有一个“有无耳洞”的属性。Labview的开发者为了让用户更加明白继承的层次关系,采用以下术语:(1)父类(即基类/超类):供其他labview类继承的数据、公共型成员VI(即方法)/保护型成员VI的labview类;(2)子类(即派生类):从父类继承数据、公共型成员VI/保护型成员VI的labview类;(3)兄弟类:和一个labview类继承同一个父类的的另一个labview类;(4)祖先类:一个labview类的上一层(父类)、上两层(父类的父类)、上三层等。Labviewobject类是所有类的始祖;(4)子孙类:一个labview类的下一层(子类)、下二层(子类的是子类)、下三层等。Labview有一个最终类,就是labviewobject类,通过labviewobject类创建的VI,能最多个labview类执行通用的操作。在labview中所有类的属性都是私有的,不能被外部的类和VI访问。外部程序如需访问类中的私有数据,必须首先创建该类的成员VI,在该成员VI上对私有数据进行操作。外部程序通过访问该成员VI,从而达到对类中私有数据操作的目的。这一点和C++是一致的。子类只继承一个父类的数据结构和方法,则称为单重继承;子类继承了多个父类的数据结构和方法,则称为多重继承。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。五、多态多态,同一个方法以不同的形式实现,即同一个父类的不同子类,虽然都继承了父类的方法,但他们的实现形式不一样。比方说动物类有“发出声音”这个方法,但作为继承动物类的子类猫类和狗类,他们的发出声音是不一样的,这就是“多态”。3具体来说,多态分为重载和重写。重载就是一个方法的方法名相同而所具有的参数列表或者参数类型不同。比如:publicStringtalk(Stringcontent);//参数是String,publicStringtalk(Stringcontent,intnumber)//参数是2个,String和int重载的规则:1.必须具有不同的参数列表(体现在参数个数或参数类型或者参数次序不同);2.可以有不同的返回类型,只要参数列表不同就可以了;3.可以有不同的访问修饰符;4.可以抛出不同的异常;重载的作用:例如构造方法重载后,便于我们根据各自的需要调用相应的构造方法来对类进行实例化。重写,是指在子类中对父类的某方法进行重新定义,其子类的该方法名以及参数位置和个数均与父类相同,从而在调用子类的该方法时,不会执行父类的方法。重写的方法名和参数都必须完全相同。重写方法只能存在于具有继承关系中,重写方法只能重写父类非私有的方法。比如父类publicStringtalk(Stringcontent){System.out.print(content);}子类继承该类,所以也具有talk这个方法,他重新定义了该方法的实现publicStringtalk(Stringcontent){System.out.println(Hi+content);}重写方法的规则:1.参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载。2.返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载3.访问修饰符的限制一定要大于被重写方法的访问修饰符(publicprotecteddefaultprivate)重写的作用:子类重写父类的方法后,具有自己特有的行为。4六、接口接口则是指定义了方法的名字,而不定义他的实现,它是可以被外部用户看见的(而内部的实现,则用户看不见)。方法的具体实现由其实现类去完成。比如publicinterfacemp3{publicvoidplay();publicvoidpause();}这就定义了一个mp3的接口,任何其他类都可以实现这个类,但是实现这个接口就必须实现这个接口所定义的方法。换句话说,任何实现mp3的类,都必须具有play()和pause()的方法,比如publicclassIPodimplementsmp3{publicvoidplay(){//具体实现}publicvoidpause(){//具体实现}}七、构造函数与析构函数1)构造函数a.是特殊的成员函数;在创建对象时首先由系统自动调用。它的作用是为新创建的对象分配空间,或为该对象的成员变量赋值等;b.构造函数名必须与其类名称完全相同,并且不允许有返回值。2)析构函数a.析构函数是构造函数的逆操作;b.析构函数在类名之前加~来命名,它不允许有返回值,也不允许带参数,并且一个类只能有一个析构函数。在继承关系下,派生类(子类)的构造函数负责调用基类的构造函数来设置基类数据成员值。3)构造函数的调用顺序:5a.在定义派生类对象时,系统首先调用基类的构造函数,然后调用派生类的构造函数;在上例中,derived类首先调用base类的构造函数,然后调用自身的构造函数。b.析构函数的调用顺序与构造函数的调用顺序相反。