Matlab句柄对象属性疑问:不同对象的属性是否指向同一实例?
为什么两个Book实例的page1指向同一个Page句柄?
这问题我刚学Matlab句柄类的时候也踩过一模一样的坑!咱们一步步来拆解原因和解决办法。
问题根源:Matlab类属性的默认初始化机制
你在Book类的properties块里直接写page1 = Page;的时候,这个Page()的实例化操作只在类第一次被加载到内存时执行一次,而不是每次创建Book对象时都重新生成一个新的Page实例。
也就是说,所有Book的实例都会共享这个预先创建好的Page对象——相当于这个page1属性是类级别的共享引用,而不是每个实例独有的。这就导致你创建iliad和odyssey之后,它们的page1自然指向同一个句柄。
正确的使用方式:在构造函数里初始化句柄属性
要让每个Book实例都拥有独立的Page对象,你需要把属性的初始化逻辑放到类的构造函数里,这样每次创建Book实例时,都会执行构造函数里的代码,生成新的Page对象。
修改后的Book类代码如下:
classdef Book < handle properties page1; % 这里不要直接赋值默认值 page2; end methods function obj = Book() % 在构造函数中初始化每个属性,每个实例都会新建Page对象 obj.page1 = Page; obj.page2 = Page; end end end
现在再测试一下:
iliad = Book; odyssey = Book; eq(iliad.page1, odyssey.page1) % 现在会返回 logical 0,符合预期
额外补充:值类 vs 句柄类的差异
如果Page是值类(不继承handle),那原来的写法不会有问题——因为值类的默认属性值会在每个实例创建时被复制一份。但句柄类是引用类型,默认初始化的共享特性就会导致这种“意外共享”的问题,这也是句柄类使用时需要特别注意的点。
内容的提问来源于stack exchange,提问作者matlab_beginner
相关产品推荐
相关产品推荐

