一个价值类构造函数返回一个对象,该对象与赋值给它的变量相关联。如果你重新分配这个变量,MATLAB®创建原始对象的独立副本。如果将此变量传递给函数以修改它,则该函数必须将修改后的对象作为输出参数返回。有关值类行为的信息,请参见避免不必要的数据拷贝.
一个处理类构造函数返回一个句柄对象,该句柄对象是所创建对象的引用。您可以将句柄对象分配给多个变量或将其传递给函数,而不会导致MATLAB复制原始对象。修改作为输入参数传递的句柄对象的函数不需要返回该对象。
所有句柄类都是从抽象派生的处理
类。
默认情况下,MATLAB类是值类。下面的定义创建一个名为MyValueClass
:
classdefMyValueClass...
结束
要创建处理
类的派生类处理
类。
classdefMyHandleClass < handle...
结束
MATLAB的基本类是值类(数值类,逻辑
,字符
,细胞
,结构体
,和函数句柄)。例如,如果创建类的对象int32
并复制此对象,结果是两个独立的对象。当你改变的值一个
的值。b
不会改变。这种行为是表示值的类的典型行为。
A = int32(7);B = a;A = A ^4;
b 7
MATLAB图形对象被实现为句柄对象,因为它们表示视觉元素。例如,创建一个图形行对象并将其句柄复制到另一个变量。两个变量都指向同一个行对象。
X = 1:10;Y = sinx;L1 =直线(x,y);L2 = l1;
使用句柄的任意一个副本设置行对象的属性。
集(l2,“颜色”,“红色”)设置(l1,“颜色”,“绿色”)
get (l2,“颜色”)
Ans = 0
调用删除
函数在l2
句柄销毁行对象。如果您试图设置颜色
财产在线l1
,集
函数返回错误。
删除(l2)集(l1,“颜色”,“蓝”)
使用matlab.graphics.primitive时出错。Line/set无效或删除对象。
如果通过删除任何一个现有句柄来删除该对象,则所有副本现在都无效,因为您删除了所有句柄引用的单个对象。
删除句柄对象与清除句柄变量不同。在图形对象层次结构中,对象的父对象保存着对该对象的引用。例如,父轴保存对被引用的行对象的引用l1
而且l2
.如果从工作空间中清除这两个变量,则对象仍然存在。
有关句柄对象行为的详细信息,请参见处理对象行为.
MATLAB将值类的对象与指定对象的变量关联起来。当您将值对象复制到另一个变量或将值对象传递给函数时,MATLAB将创建该对象的独立副本以及该对象包含的所有数据。新对象独立于对原始对象的更改。值对象的行为类似MATLAB数值和结构体
类。每个属性本质上都像MATLAB数组。
值对象总是与一个工作区或临时变量相关联。当值对象的变量超出作用域或被清除时,值对象将超出作用域。没有对值对象的引用,只有作为独立对象的副本。
下面是一个值类,它将值存储在数量
财产。默认属性值是数字1
.
classdefNumValue属性Number = 1结束结束
创建一个NumValue
赋给变量的对象一个
.
a = NumValue
a = NumValue,属性:Number: 1
赋值为一个
对另一个变量,b
.
B = a
b = NumValue,带有属性:Number: 1
的变量一个
而且b
是独立的。的值数量
的属性一个
不影响数量
的属性b
.
a.Number = 7
a = NumValue,属性:Number: 7
b
b = NumValue,带有属性:Number: 1
将值对象传递给函数时,MATLAB将在函数工作区中创建该对象的副本。因为值对象的副本是独立的,所以函数不会修改调用者工作区中的对象。因此,修改值对象的函数必须返回修改后的对象,以便在调用者的工作区中重新分配。
有关更多信息,请参见对象修改.
类派生的类的实例处理
类都是对底层对象数据的引用。复制句柄对象时,MATLAB复制句柄,但不复制存储在对象属性中的数据。副本引用与原始句柄相同的对象。如果更改原始对象上的属性值,复制的句柄将引用相同的更改。
下面是一个句柄类,它将值存储在数量
财产。默认属性值是数字1
.
classdefNumHandle < handle属性Number = 1结束结束
创建一个NumHandle
赋值给变量的对象一个
.
a = NumHandle
a = NumHandle,属性:Number: 1
赋值为一个
对另一个变量,b
.
B = a
b =带有属性的NumHandle: Number: 1
的变量一个
而且b
引用相同的底层对象。的值数量
的属性一个
还将更改数量
的属性b
.也就是说,一个
而且b
引用同一个对象。
a.Number = 7
a = NumHandle,属性:Number: 7
b
b = NumHandle,属性:Number: 7
将句柄对象传递给函数时,MATLAB会在函数工作区中创建句柄的副本。由于句柄的副本引用相同的底层对象,因此修改句柄对象的函数也会有效地修改调用者工作区中的对象。因此,修改处理作为输入参数传递的对象的函数没有必要将修改后的对象返回给调用者。
有关更多信息,请参见对象修改.
可以通过显式调用句柄来销毁句柄对象删除
方法。删除句柄类对象的句柄将使所有句柄无效。例如:
a = NumHandle;B = a;删除(a) b.Number
无效或已删除的对象。
调用删除
在句柄对象上调用该对象的析构函数。看到句柄类析构函数获取更多信息。
有关在属性块中将属性初始化为默认值与从构造函数中初始化属性之间的区别的信息,请参见初始化属性值而且初始化句柄对象的数组.
值对象的相等性意味着对象属于同一类并且具有相同的状态。
句柄对象的相等性意味着句柄变量引用同一个对象。您还可以识别引用具有相同状态的同一类的不同对象的句柄变量。
要确定值对象的大小是否相同,其内容的值是否相等,请使用isequal
.例如,使用前面定义的NumValue
类创建两个实例并测试是否相等:
a = NumValue;b = NumValue;isequal (a, b)
Ans = 1
一个
而且b
是独立的,因此不是同一对象。但是每一个都代表相同的值。
如果更改值对象表示的值,则对象不再相等。
a = NumValue;b = NumValue;b.数字= 7;isequal (a, b)
Ans = 0
值类没有默认值情商
方法来实现= =
操作。
句柄对象继承情商
方法。处理
基类。你可以使用= =
而且isequal
测试句柄对象之间的两种不同关系:
句柄指向同一个对象:= =
而且isequal
返回真正的
.
句柄引用具有相同值的同一类的对象,但不是相同的对象isequal
返回真正的
.
使用之前定义的NumHandle
类创建对象并复制句柄。
a = NumHandle;B = a;
使用相等性检验= =
而且isequal
.
A == b
Ans = 1
isequal (a, b)
Ans = 1
类的两个实例NumHandle
使用默认值初始化。
a = NumHandle;b = NumHandle;
确定一个
而且b
引用同一个对象。
A == b
Ans = 0
确定一个
而且b
有相同的价值观。
isequal (a, b)
Ans = 1
由处理
类使你的类:
继承几个有用的方法(处理类方法)
定义事件和监听器(事件和监听器语法)
定义动态属性(动态属性-向实例添加属性)
实现set和get方法(实现属性的设置/获取接口)
自定义复制行为(实现句柄类的复制)
看到句柄超类有关句柄类及其方法的更多信息。