的比较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++中,使用作用域操作符调用超类方法:gydF4y2Ba
超类::方法gydF4y2Ba
在Java代码中,你可以使用:gydF4y2Ba
superclass.methodgydF4y2Ba
等价的MATLAB运算为gydF4y2Ba
.gydF4y2Bamethod@superclassgydF4y2Ba
其他的差异gydF4y2Ba
在MATLAB类中,没有等价于c++模板或Java泛型的东西。然而,MATLAB是弱类型的,它可以编写处理不同类型数据的函数和类。gydF4y2Ba
MATLAB类不支持对相同函数名使用不同签名的重载函数。gydF4y2Ba
对象修改gydF4y2Ba
MATLAB类可以定义公共属性,您可以通过在类的给定实例上显式地为这些属性赋值来修改这些属性。但是,只有类派生自gydF4y2Ba处理gydF4y2Ba
类展示引用行为。修改值类(未派生的类)的实例上的属性值gydF4y2Ba处理gydF4y2Ba
),只在进行修改的上下文中更改值。gydF4y2Ba
下面的部分将更详细地描述这种行为。gydF4y2Ba
传递给函数的对象gydF4y2Ba
MATLAB通过值传递所有变量。当您将一个对象传递给一个函数时,MATLAB会将调用者的值复制到被调用函数的参数变量中。gydF4y2Ba
然而,MATLAB支持两种类型的类,它们在复制时表现不同:gydF4y2Ba
句柄类——句柄类实例变量引用一个对象。句柄类实例变量的副本引用与原始变量相同的对象。如果函数修改作为输入参数传递的句柄对象,则修改将影响原始句柄和复制句柄引用的对象。gydF4y2Ba
值类——值类实例中的属性数据独立于该实例副本中的属性数据(尽管值类属性可能包含句柄)。函数可以修改作为输入参数传递的值对象,但这种修改不会影响原始对象。gydF4y2Ba
看到gydF4y2Ba句柄类与值类的比较gydF4y2Ba有关这两种类的行为和使用的更多信息。gydF4y2Ba
通过值对象。gydF4y2Ba将值对象传递给函数时,函数会创建实参变量的本地副本。该函数只能修改副本。如果希望修改原始对象,则返回修改后的对象并将其赋值给原始变量名。例如,考虑值类,gydF4y2BaSimpleClassgydF4y2Ba
:gydF4y2Ba
classdefgydF4y2BaSimpleClassgydF4y2Ba属性gydF4y2Ba颜色gydF4y2Ba结束gydF4y2Ba方法gydF4y2Ba函数gydF4y2Baobj = SimpleClass (c)gydF4y2Ba如果gydF4y2BaNargin > 0 obj。颜色= 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 <处理gydF4y2Ba属性gydF4y2Ba颜色gydF4y2Ba结束gydF4y2Ba方法gydF4y2Ba函数gydF4y2Baobj = SimpleHandleClass (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.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
在Java领域。要使用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 | 不受支持的。看到gydF4y2Ba 有关可变静态数据,请参见gydF4y2Ba静态数据gydF4y2Ba |
构造函数gydF4y2Ba | 类的构造函数方法gydF4y2Ba |
拷贝构造函数gydF4y2Ba | 没有直接等效gydF4y2Ba |
参考/引用类gydF4y2Ba | 句柄类与值类的比较gydF4y2Ba |
抽象类/接口gydF4y2Ba | 抽象类和类成员gydF4y2Ba |
垃圾收集gydF4y2Ba | 对象生命周期gydF4y2Ba |
实例属性gydF4y2Ba | 动态属性——向实例添加属性gydF4y2Ba |
进口类gydF4y2Ba | 进口类gydF4y2Ba |
事件和监听器gydF4y2Ba | 事件和侦听器的概念gydF4y2Ba |