主要内容gydF4y2Ba

的比较gydF4y2BaMATLABgydF4y2Ba和其他面向对象语言gydF4y2Ba

与c++和gydF4y2BaJavagydF4y2Ba代码gydF4y2Ba

MATLABgydF4y2Ba®gydF4y2Ba编程语言不同于其他面向对象的语言,如c++或JavagydF4y2Ba®gydF4y2Ba在一些重要的方面。gydF4y2Ba

公共属性gydF4y2Ba

与c++或Java语言中的字段不同,可以使用MATLAB属性定义与数据存储实现分离的公共接口。您可以提供对属性的公共访问,因为您可以定义set和get访问方法,这些方法在分配或查询属性值时自动执行。例如,下面的语句:gydF4y2Ba

myobj。材料=gydF4y2Ba“塑料”gydF4y2Ba;gydF4y2Ba

分配的gydF4y2Ba字符gydF4y2Ba向量gydF4y2Ba塑料gydF4y2Ba到gydF4y2Ba材料gydF4y2Ba的属性gydF4y2BamyobjgydF4y2Ba.在做实际作业之前,gydF4y2BamyobjgydF4y2Ba执行一个方法gydF4y2Ba集。材料gydF4y2Ba(假设的类gydF4y2BamyobjgydF4y2Ba定义此方法),该方法可以执行任何必要的操作。看到gydF4y2Ba属性访问方法gydF4y2Ba有关属性访问方法的更多信息。gydF4y2Ba

您还可以通过设置属性来控制对属性的访问,这些属性将启用公共、受保护或私有访问。看到gydF4y2Ba属性的属性gydF4y2Ba获取属性属性的完整列表。gydF4y2Ba

无隐式参数gydF4y2Ba

在某些语言中,方法的一个对象参数总是隐式的。在MATLAB中,对象是作用于对象的方法的显式参数。gydF4y2Ba

调度gydF4y2Ba

在MATLAB类中,方法调度不像在c++和Java代码中那样基于方法签名。当参数列表包含同等优先级的对象时,MATLAB使用最左边的对象来选择要调用的方法。gydF4y2Ba

然而,如果一个实参的类优于其他实参的类,MATLAB将调度到更优实参的方法,而不管它在实参列表中的位置。gydF4y2Ba

看到gydF4y2Ba类优先gydF4y2Ba获取更多信息。gydF4y2Ba

调用超类方法gydF4y2Ba

  • 在c++中,使用scope操作符调用超类方法:gydF4y2Ba超类::方法gydF4y2Ba

  • 在Java代码中,您使用:gydF4y2Basuperclass.methodgydF4y2Ba

等效的MATLAB运算为gydF4y2Bamethod@superclassgydF4y2Ba.gydF4y2Ba

其他的差异gydF4y2Ba

在MATLAB类中,没有等价于c++模板或Java泛型。然而,MATLAB是弱类型的,可以编写处理不同类型数据的函数和类。gydF4y2Ba

MATLAB类不支持对相同函数名使用不同签名万博1manbetx的重载函数。gydF4y2Ba

对象修改gydF4y2Ba

MATLAB类可以定义公共属性,您可以通过在给定的类实例上显式地为这些属性赋值来修改这些属性。类派生的类gydF4y2Ba处理gydF4y2Ba类显示引用行为。修改值类(非派生类)的实例上的属性值gydF4y2Ba处理gydF4y2Ba),只在进行修改的上下文中更改值。gydF4y2Ba

下面几节将更详细地描述这种行为。gydF4y2Ba

传递给函数的对象gydF4y2Ba

MATLAB通过值传递所有变量。将对象传递给函数时,MATLAB会将调用者的值复制到被调用函数的参数变量中。gydF4y2Ba

然而,MATLAB支持两种类型的万博1manbetx类,它们在复制时表现不同:gydF4y2Ba

  • 句柄类——句柄类实例变量引用一个对象。句柄类实例变量的副本引用与原始变量相同的对象。如果函数修改了作为输入参数传递的句柄对象,该修改将影响原始句柄和复制句柄引用的对象。gydF4y2Ba

  • 值类——值类实例中的属性数据独立于该实例副本中的属性数据(尽管值类属性可以包含句柄)。函数可以修改作为输入参数传递的值对象,但这种修改不会影响原始对象。gydF4y2Ba

看到gydF4y2Ba句柄类和值类的比较gydF4y2Ba有关这两种类的行为和使用的更多信息。gydF4y2Ba

传递值对象。gydF4y2Ba将值对象传递给函数时,函数会创建参数变量的局部副本。该功能只能修改副本。如果要修改原始对象,则返回修改后的对象并将其分配给原始变量名。例如,考虑值类,gydF4y2BaSimpleClassgydF4y2Ba:gydF4y2Ba

classdefgydF4y2BaSimpleClassgydF4y2Ba属性gydF4y2Ba颜色gydF4y2Ba结束gydF4y2Ba方法gydF4y2Ba函数gydF4y2Baobj = SimpleClass(c)gydF4y2Ba如果gydF4y2BaNargin > 0 obj。Color = c;gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba

创建的实例gydF4y2BaSimpleClassgydF4y2Ba,赋值为gydF4y2Ba红色的gydF4y2Ba对其gydF4y2Ba颜色gydF4y2Ba属性:gydF4y2Ba

obj = SimpleClass(gydF4y2Ba“红色”gydF4y2Ba);gydF4y2Ba

将对象传递给函数gydF4y2BaggydF4y2Ba,负责分配gydF4y2Ba蓝色的gydF4y2Ba到gydF4y2Ba颜色gydF4y2Ba属性:gydF4y2Ba

函数gydF4y2Bay = g(x) x. color =gydF4y2Ba“蓝”gydF4y2Ba;Y = x;gydF4y2Ba结束gydF4y2Ba
Y = g(obj);gydF4y2Ba

这个函数gydF4y2BaggydF4y2Ba修改输入对象的副本并返回该副本,但不更改原始对象。gydF4y2Ba

y.ColorgydF4y2Ba
Ans =蓝色gydF4y2Ba
obj。Color
Ans =红色gydF4y2Ba

如果函数gydF4y2BaggydF4y2Ba没有返回值,修改对象gydF4y2Ba颜色gydF4y2Ba属性将只在副本上出现gydF4y2BaobjgydF4y2Ba在函数工作区中。当函数执行结束时,该副本将超出作用域。gydF4y2Ba

重写原来的变量实际上是用一个新对象替换它:gydF4y2Ba

Obj = g(Obj);gydF4y2Ba

传递句柄对象。gydF4y2Ba将句柄传递给函数时,函数会复制句柄变量,就像传递值对象一样。但是,由于句柄对象的副本引用与原始句柄相同的对象,因此该函数可以修改该对象而不必返回修改后的对象。gydF4y2Ba

例如,假设修改gydF4y2BaSimpleClassgydF4y2Ba类的定义,使类派生自gydF4y2Ba处理gydF4y2Ba类:gydF4y2Ba

classdefgydF4y2BaSimpleHandleClass < handlegydF4y2Ba属性gydF4y2Ba颜色gydF4y2Ba结束gydF4y2Ba方法gydF4y2Ba函数gydF4y2Baobj = SimpleHandleClass(c)gydF4y2Ba如果gydF4y2BaNargin > 0 obj。Color = c;gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba

创建的实例gydF4y2BaSimpleHandleClassgydF4y2Ba,赋值为gydF4y2Ba红色的gydF4y2Ba对其gydF4y2Ba颜色gydF4y2Ba属性:gydF4y2Ba

obj = SimpleHandleClass(gydF4y2Ba“红色”gydF4y2Ba);gydF4y2Ba

将对象传递给函数gydF4y2BaggydF4y2Ba,负责分配gydF4y2Ba蓝色的gydF4y2Ba到gydF4y2Ba颜色gydF4y2Ba属性:gydF4y2Ba

Y = g(obj);gydF4y2Ba

这个函数gydF4y2BaggydF4y2Ba设置gydF4y2Ba颜色gydF4y2Ba返回句柄和原始句柄同时引用的对象的属性:gydF4y2Ba

y.ColorgydF4y2Ba
Ans =蓝色gydF4y2Ba
obj。Color
Ans =蓝色gydF4y2Ba

的变量gydF4y2BaygydF4y2Ba而且gydF4y2BaobjgydF4y2Ba指同一对象:gydF4y2Ba

y.Color =gydF4y2Ba“黄色”gydF4y2Ba;obj。Color
Ans =黄色gydF4y2Ba

这个函数gydF4y2BaggydF4y2Ba修改了input参数引用的对象(gydF4y2BaobjgydF4y2Ba)并返回该对象的句柄gydF4y2BaygydF4y2Ba.gydF4y2Ba

MATLABgydF4y2Ba按值传递句柄。gydF4y2Ba句柄变量是对对象的引用。MATLAB通过值传递这个引用。gydF4y2Ba

句柄的行为不像c++中的引用。如果将一个对象句柄传递给一个函数,而该函数将另一个对象分配给该句柄变量,则调用方中的变量不受影响。例如,假设您定义了一个函数gydF4y2Bag2gydF4y2Ba:gydF4y2Ba

函数gydF4y2Bay = g2(x) x = SimpleHandleClass(gydF4y2Ba“绿色”gydF4y2Ba);Y = x;gydF4y2Ba结束gydF4y2Ba

传递句柄对象gydF4y2Bag2gydF4y2Ba:gydF4y2Ba

obj = SimpleHandleClass(gydF4y2Ba“红色”gydF4y2Ba);Y = g2(obj);y.ColorgydF4y2Ba
Ans =绿色gydF4y2Ba
obj。Color
Ans =红色gydF4y2Ba

该函数覆盖作为参数传入的句柄,但不覆盖该句柄引用的对象。原手柄gydF4y2BaobjgydF4y2Ba仍然引用原始对象。gydF4y2Ba

静态属性gydF4y2Ba

在MATLAB中,类可以定义常量属性,但不能定义c++等其他语言意义上的“静态”属性。不能从类定义中指定的初始值更改常量属性。gydF4y2Ba

MATLAB有一个长期存在的规则,变量总是优先于函数和类的名称。赋值语句在变量不存在时引入变量。gydF4y2Ba

这种形式的表达式gydF4y2Ba

A.b = cgydF4y2Ba

引入一个新变量,gydF4y2Ba一个gydF4y2Ba,那是一个gydF4y2Ba结构体gydF4y2Ba包含字段gydF4y2BaBgydF4y2Ba的值为gydF4y2BaCgydF4y2Ba.如果gydF4y2BaA.b = cgydF4y2Ba可以引用类的静态属性吗gydF4y2Ba一个gydF4y2Ba,然后上课gydF4y2Ba一个gydF4y2Ba会优先于变量吗gydF4y2Ba一个gydF4y2Ba.gydF4y2Ba

这种行为与以前的MATLAB版本明显不兼容。例如,引入一个名为gydF4y2Ba一个gydF4y2Ba可以改变赋值语句的含义,比如gydF4y2BaA.b = cgydF4y2Ba在一个gydF4y2Ba.m代码文件。gydF4y2Ba

在其他语言中,类很少使用静态数据,除非作为类内的私有数据或公共常量。在MATLAB中,你可以用相同的方法使用常数属性gydF4y2Ba公共gydF4y2Ba最后gydF4y2Ba静态gydF4y2Ba字段。若要在MATLAB中使用类内部的数据,请在私有或受保护的方法或类私有使用的局部函数中创建持久变量。gydF4y2Ba

避免MATLAB中的静态数据。如果一个类具有静态数据,在多个应用程序中使用同一个类会导致应用程序之间发生冲突。在其他一些语言中,冲突不是什么问题。这些语言将应用程序编译成运行在不同进程中的可执行文件。每个进程都有自己的类静态数据副本。MATLAB经常在相同的进程和环境中运行许多不同的应用程序,每个类都有一个副本。gydF4y2Ba

有关在MATLAB中定义和使用静态数据的方法,请参见gydF4y2Ba静态数据gydF4y2Ba.gydF4y2Ba

常见的面向对象技术gydF4y2Ba

此表提供了到讨论其他面向对象语言常用的面向对象技术的部分的链接。gydF4y2Ba

技术gydF4y2Ba 如何在MATLAB中使用gydF4y2Ba
操作符重载gydF4y2Ba 操作符重载gydF4y2Ba
多重继承gydF4y2Ba 子类化多个类gydF4y2Ba
子类化gydF4y2Ba 设计子类构造函数gydF4y2Ba
析构函数gydF4y2Ba 句柄类析构函数gydF4y2Ba
数据成员作用域gydF4y2Ba 属性的属性gydF4y2Ba
包(范围类)gydF4y2Ba 包创建命名空间gydF4y2Ba
命名常量gydF4y2Ba 看到gydF4y2Ba用常量定义类属性gydF4y2Ba而且gydF4y2Ba指定值gydF4y2Ba
枚举gydF4y2Ba 定义枚举类gydF4y2Ba
静态方法gydF4y2Ba 静态方法gydF4y2Ba
静态属性gydF4y2Ba

不受支持万博1manbetx的。看到gydF4y2Ba持续的gydF4y2Ba变量。相当于JavagydF4y2Ba静态gydF4y2Ba最后gydF4y2Ba或c++gydF4y2Ba静态gydF4y2Ba常量gydF4y2Ba属性,使用gydF4y2Ba常数gydF4y2Ba属性。看到gydF4y2Ba用常量定义类属性gydF4y2Ba

有关可变静态数据,请参见gydF4y2Ba静态数据gydF4y2Ba

构造函数gydF4y2Ba 类构造方法gydF4y2Ba
拷贝构造函数gydF4y2Ba 没有直接对等物gydF4y2Ba
参考/引用类gydF4y2Ba 句柄类和值类的比较gydF4y2Ba
抽象类/接口gydF4y2Ba 抽象类和类成员gydF4y2Ba
垃圾收集gydF4y2Ba 对象生命周期gydF4y2Ba
实例属性gydF4y2Ba 动态属性-向实例添加属性gydF4y2Ba
进口类gydF4y2Ba 进口类gydF4y2Ba
事件和听众gydF4y2Ba 事件和监听器概念gydF4y2Ba