文档gydF4y2Ba

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

与c++和的一些区别gydF4y2BaJavagydF4y2Ba代码gydF4y2Ba

MATLABgydF4y2Ba®gydF4y2Ba编程语言与其他面向对象语言不同,如C++或java语言。gydF4y2Ba®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++中,使用作用域操作符调用超类方法:gydF4y2Ba超类::方法gydF4y2Ba

  • 在Java代码中,您使用:gydF4y2Ba超类方法gydF4y2Ba

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

其他的差异gydF4y2Ba

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

MATLAB类不支持对相同函数名使用不同签名金宝app的函数重载。gydF4y2Ba

对象修改gydF4y2Ba

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

接下来的部分将更详细地描述这种行为。gydF4y2Ba

传递给函数的对象gydF4y2Ba

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

然而,MATLAB支持两种在复制金宝app时行为不同的类:gydF4y2Ba

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

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

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

通过值对象。gydF4y2Ba当你将一个值对象传递给一个函数时,函数会创建一个参数变量的局部副本。函数只能修改副本。如果您想修改原始对象,请返回修改后的对象并将其赋值给原始变量名。例如,考虑值类,gydF4y2Ba简单类gydF4y2Ba:gydF4y2Ba

classdefgydF4y2Ba简单类gydF4y2Ba性质gydF4y2Ba颜色gydF4y2Ba结束gydF4y2Ba方法gydF4y2Ba功能gydF4y2Baobj=简单类(c)gydF4y2Ba如果gydF4y2BaNargin > 0 obj。颜色= c;gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba

创建的实例gydF4y2Ba简单类gydF4y2Ba,赋值为gydF4y2Ba红色的gydF4y2Ba到gydF4y2Ba颜色gydF4y2Ba财产:gydF4y2Ba

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

将对象传递给函数gydF4y2BaggydF4y2Ba,指定gydF4y2Ba蓝色的gydF4y2Ba到gydF4y2Ba颜色gydF4y2Ba财产:gydF4y2Ba

功能gydF4y2Bay = g(x) xgydF4y2Ba“蓝”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

例如,假设您修改gydF4y2Ba简单类gydF4y2Ba类定义,使类从gydF4y2Ba处理gydF4y2Ba类:gydF4y2Ba

classdefgydF4y2BaSimpleHandleClass <处理gydF4y2Ba性质gydF4y2Ba颜色gydF4y2Ba结束gydF4y2Ba方法gydF4y2Ba功能gydF4y2Baobj=简单HandleClass(c)gydF4y2Ba如果gydF4y2BaNargin > 0 obj。颜色= 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修改输入参数引用的对象(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、 颜色gydF4y2Ba
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在MATLAB路径上可以改变赋值语句的含义,比如gydF4y2BaA.B = CgydF4y2Ba在一个gydF4y2Ba.m代码文件。gydF4y2Ba

在其他语言中,类很少使用静态数据,除非将其作为类中的私有数据或公共常量。在MATLAB中,你可以用同样的方式使用常数属性gydF4y2Ba公众的gydF4y2Ba最后gydF4y2Ba静态gydF4y2BaJava中的字段。要使用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

不受支持金宝app的。看到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