matlab面向对象

news2025/1/15 17:25:13

一、面向对象编程

1.1 面向过程与面向对象

  • 区别:
    • 面向过程的核心是一系列函数,执行过程是依次使用每个函数
    • 面向对象的核心是对象(类)及其属性、方法,每个对象根据需求执行自己的方法以解决问题
image-20230425155810396
  • 对象:单个事务的抽象。也可理解为函数数据封装

  • 面向对象的必要性:

    image-20230425155939919

1.2 对象的基本概念

  1. :一组相关的属性行为的集合,是一个抽象的概念
    • 抽象化:抽象代表现实世界中实体的行为
    • 属性:存储在类中的数据变量
    • 方法:事物可以执行的操作或行为
    • 初始化:构造一个类并指明固有属性的过程
  2. 对象:该类事物的具体表现形式,具体存在的个体

1.3 面向对象的三个特征

  • 封装
    • 一个对象就是一个封装了数据操作这些数据的代码的实体
    • 部分数据和方法只能通过内部访问,避免意外的修改
  • 继承
    • 可以复用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行拓展
    • 提供了从特殊到一般的方法
  • 多态
    • 一个类实例的相同方法在不同情形有不同表现形式
    • 不同的对象可以通过相同的操作来调用

1.4 MATLAB面向对象编程的用法

新建文件的时候直接新建一个类文件,会自动生成一个标准类模板:

image-20230822114650351
classdef untitled
    %UNTITLED2 此处提供此类的摘要
    %   此处提供详细说明

    properties
        Property1
    end

    methods
        function obj = untitled(inputArg1, inputArg2)
            % 构造函数本身
            obj.Property1 = inputArg1 + inputArg2;
        end

        function outputArg = method1(obj, inputArg)
            % 方法
            outputArg = obj.Property1 + inputArg;
        end
    end
end

注意:

  • 类名称要和文件名保持一致
  • properties关键字:类属性
  • methods关键字:方法
    • 在methods里必须存在一个与类名相同的函数,这个函数的输出变量就是类产生的对象

1.5 实例

定义一只小狗;属性:名字、年龄;初始化:输入名字;方法1:让它坐下;方法2:询问年龄

classdef dog
    properties
        % 小狗的属性
        name
        age
    end 
    
    methods
        function obj = dog(name, age)
            % 构造函数
            obj.name = name;
            obj.age = age;
        end
        
        function sit(obj)
            % 让小狗坐下
            fprintf('%s is now sitting.\n', obj.name);
        end
    end
end
image-20230822144800834

二、面向对象的基本操作

2.1 类的属性和方法

  1. 属性

    • 属性的默认值 —— 在属性列表中指定
    • 常量属性:用Constant声明
    • 非独立属性:用Dependent声明,属性值是否取决于其他值
    • 隐藏的属性:通过Hidden声明,用于隐藏内部细节,使对象更简洁
  2. 属性的访问权限

    • 语法:(Set / Get)Access = private / protected / public
    • private:只有该类的成员方法可以访问
    • protected:只有该类的成员方法和该类的子类可以访问
    • public:除该类和子类外,在类之外的函数或脚本中也可以访问
  3. 方法

    • 构造函数Constructor
      • 构造函数和类的名称相同,用来创建类的实例
      • 一个类的定义中只能有一个构造函数
      • 构造函数只能有一个返回值,即新创建的对象

2.2 类的组合和继承

  • 继承是为了提高代码复用性,但也要注重逻辑性
image-20230426112910880
  • 实例:有一个车辆类vehicle,现在要创建一个电动车类e_vehicle

    • vehicle.m

      classdef vehicle < handle  
          properties
              make
          end
          properties(SetAccess=protected)
              car_miles = 0;
          end
          properties(Hidden)
              year
          end
          properties(Dependent)
              car_km
          end
          
          methods
              function obj = vehicle(year, make)
                  obj.make = make;
                  obj.year = year;
              end
              function descripe(obj)
                  fprintf('%s made in %d.\n', obj.make, obj.year);
              end
              function run(obj, miles)
                  obj.car_miles = obj.car_miles + miles;
              end
          end
      end
      
    • e_vehicle.m

      classdef e_vehicle < vehicle
          properties
              soc
          end
          properties(Constant)
              soc_per_mile = 1;   % 常量属性
          end
          
          methods
              function obj = e_vehicle(soc, year, make)
                  obj = obj@vehicle(year, make); % 用@调用父类方法
                  obj.soc = soc;
              end
              function run(obj, miles)
                  run@vehicle(obj, miles);
                  obj.soc = obj.soc - miles*obj.soc_per_mile;
              end
          end
      end
      
    • 实例化一个e_vehicle对象ev

      ev=e_vehicle(95,2020,'yiqi')
      
      image-20230822151246300
    • 假设跑了10英里(调用ev的方法run),查看ev的里程

      ev.run(10)
      ev.car_miles
      
      image-20230822151443823
    • 跑了10英里后,电量减少了,ev.soc查看从95变成了85

2.3 句柄类和实体类

  • handle类是遵循句柄语义的所有类的超类

    • 句柄是引用handle类的对象的变量
    • 多个变量可以引用同一个对象
  • handle类是抽象类,无法直接创建该类的实例。可使用handle类派生其他类,可以使其实例为句柄对象的具体类

    classdef MyHandleClass < handle		% 表示MyHandleClass类继承于handle类
     	...
    end
    
  • 值类(实体类,Value):

    • 构造函数返回一个与其赋值变量相关联的对象
    • 复制行为会创建一个独立的副本
    • 值类对象在方法中修改后需要返回对象本身
  • 句柄类:

    • 构造函数返回一个句柄对象,该对象是对所创建对象的引用
    • 复制的句柄指向同一块内存,不会创建副本
    • 函数对作为输入参数传递的句柄对象进行修改后,不必返回该对象

例子:

值类dog_value.m

classdef dog_value
    properties
        % 小狗的属性
        name
        age
    end 
    
    methods
        function obj = dog_value(name, age)
            % 构造函数
            obj.name = name;
            obj.age = age;
        end
        
        function sit(obj)
            % 让小狗坐下
            fprintf('%s is now sitting.\n', obj.name);
        end
    end
end

句柄类dog_handle.m(代码与值类一样,名称不同而已,定义时加上handle)

classdef dog_handle < handle
    properties
        % 小狗的属性
        name
        age
    end 
    
    methods
        function obj = dog_handle(name, age)
            % 构造函数
            obj.name = name;
            obj.age = age;
        end
        
        function sit(obj)
            % 让小狗坐下
            fprintf('%s is now sitting.\n', obj.name);
        end
    end
end
  • 分别创建两种类的实例

    image-20230822152913396
  • 复制值类dv,会创建一个独立的副本,即dv_copy与dv是相互独立的,互不影响

    image-20230822153300867
    • 将dv的age修改成10,但是dv_copy的age没改变
  • 复制句柄类dh,句柄指向同一块内存,不会创建副本,即修改其中一个的属性就会影响到另外一个

    • 修改dh的年龄,dh_copy的年龄也被修改了
    image-20230822153530554
  • 值类对象在方法中修改后需要返回对象本身

    • 在值类dog_value.m中添加一个方法set_age用于修改年龄

      • 如下图这样添加是无法修改的,因为值类对象在方法中修改后需要返回对象本身

        function set_age(obj, age)
        	% 修改年龄
        	obj.age = age;
        end
        
      image-20230822160127744
      • 正确的是:

        • 调用的时候如果只是执行dv.set_age这个方法,dv的age并不会被修改,因为没有返回对象本身
    • 正确的是dv = dv.set_age(2),这样才能修改dv的age

      function obj = set_age(obj, age) % 修改后需要返回对象本身
      	% 修改年龄
      	obj.age = age;
      end
      
    image-20230822160524761
  • 相比之下,句柄类就会更简单一些

    • 直接添加如下方法,不需要返回对象本身

      function set_age(obj, age)
      	% 修改年龄
      	obj.age = age;
      end
      
      image-20230822161018269
    • 调用方法set_age后,dh对象的age即被修改

  • 判断对象是否相等

    • 对于handle类
      • 可以用**==isequal**判断是否指向同一块内存(句柄复制)
      • 可以用isequal判断指向不同内存的对象是否属性一致
    • 对于value类
      • 不支持使用==判断相等关系,但可以进行运算符重载
      • 可以用isequal判断相等关系

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/914946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA 读取jar包中excel模板

1、在resources路径下&#xff0c;新建report文件夹&#xff0c;放入excel模板 2、配置文件中的目录&#xff0c;分隔符使用 / template: /report/报告模板V1.0.xlsx3、使用getResourceAsStream()读取 XSSFWorkbook wb;try {//需要以/开始InputStream resourceAsStream this.g…

中国芯,寻找新赛道迫在眉睫

北京华兴万邦管理咨询有限公司 商瑞 陈皓 近期国内半导体行业的热点可以用两个“有点多”来描述&#xff0c;一个是中国芯群体中上市公司股价闪崩的有点多&#xff0c;另一个是行业和企业的活动有点多。前者说明了许多国内芯片设计企业&#xff08;fabless商业模式&#xff09;…

怎么去选消息队列? Kafka vs. RabbitMQ

在上周&#xff0c;我们讨论了使用消息队列的好处。然后我们回顾了消息队列产品的发展历史。如今&#xff0c;在项目中需要使用消息队列时&#xff0c;Apache Kafka似乎是首选产品。然而&#xff0c;考虑到特定需求时&#xff0c;它并不总是最佳选择。 基于数据库的队列 让我们…

【由于无法验证发布者,所以 windozs 已经阳止此软件。】

由于无法验证发布者&#xff0c;所以 windozs 已经阳止此软件。 由于无法验证发布者&#xff0c;所以 windozs 已经阳止此软件。IE点击【Internet选项】在打开Internet选项的对话框中&#xff0c;点击“安全”选项卡在打开的新窗口中点击“受信任的站点”图标&#xff0c;然后点…

Linux查看文本内容的一些技巧

Linux查看文本内容的一些技巧 headtailcat输出filename.txt中第二列的内容awkcutvimdiff abc.txt def.txt 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语…

sql入门-约束

约束 作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据 外键增加--删除 # 创建dept -- 主表 create table dept ( id int primary key auto_increment comment id, name varchar(50) unicode comment 部门名称 )comment 部门表; insert into dept(name) v…

SQL注入之万能用户名

文章目录 分析代码原理实现 分析代码 在安装的cms数据库目录C:\phpStudy\WWW\cms\admin下找到login.action.php文件&#xff0c;查看第20行&#xff0c;发现如下php代码&#xff1a; $user_row $db->getOneRow("select userid from cms_users where username "…

FreeCAD傻瓜式教程之约束设定、构建实体、开孔、调整颜色、透明度、参考距离、任意修改尺寸、保持开孔居中、外部图形、基准平面等

本内容基于官方教程中的绘制简单的零件中的体会&#xff0c;在初次绘制的时候&#xff0c;总是无法完成&#xff0c;几经尝试才发现其关键点所在&#xff0c;以此文记录&#xff0c;用以被查资料&#xff0c;同时也希望能够帮到纯白新手快速熟悉该软件的绘图方法。 一、. 打开软…

联想小新Pro 16笔记本键盘失灵处理方法

问题描述&#xff1a; 联想小新Pro 16新笔记本开机准备激活&#xff0c;到连接网络的时候就开始触控板、键盘失灵&#xff0c;但是有意思的是键盘的背光灯是可以调节关闭的&#xff1b;外接鼠标是正常可以移动的&#xff0c;但是只要拔掉外接鼠标再插回去的时候就不能用了&…

8.22 作业

1. 中断实验 按下key1 led3取反 按下key2 led2取反 按下key3 led1取反 main.c #include "key.h" extern void printf(const char *fmt, ...); void delay_ms(int ms) {int i,j;for(i 0; i < ms;i)for (j 0; j < 1800; j); }int main() {rcc_init();led_…

pbootcms系统安全防护设置大全

PbootCMS系统简介 PbootCMS是全新内核且永久开源免费的PHP企业网站开发建设管理系统&#xff0c;是一套高效、简洁、 强悍的可免费商用的PHP CMS源码&#xff0c;能够满足各类企业网站开发建设的需要。系统采用简单到想哭的模板标签&#xff0c;只要懂HTML就可快速开发企业网站…

java八股文面试[java基础]——final 关键字作用

为什么局部内部类和匿名内部类只能访问final变量&#xff1a; 知识来源 【基础】final_哔哩哔哩_bilibili

Java反编译工具之javap介绍

文章目录 一、反编译定义二、反编译的使用场景1. 代码审查和调试&#xff1a;2. 学习和研究&#xff1a;3. 逆向工程&#xff1a;4. 代码重用&#xff1a; 三、反编译工具之javap1. javap介绍&#xff1a;2. 案例演示&#xff1a; 一、反编译定义 Java反编译是指将已经编译成字…

使用Java开发Jmeter自定义取样器(Sampler)插件

文章目录 1、Jmeter自定义取样器扩展类2、SpringBoot服务器端http测试例子3、自定义取样器实现3.1、默认界面的AbstractJavaSamplerClient扩展实现3.2、自定义界面的AbstractSamplerGui扩展实现 3、自定义取样器运行效果3.1、AbstractJavaSamplerClient运行效果3.2、AbstractSa…

net start Mysql 启动服务时 ,显示“Mysql服务正在启动 Mysql服务无法启动 服务没有报告任何错误

一、问题 有时候&#xff0c;输入net start Mysql 启动服务时 mysql>net start Mysql 显示 Mysql服务正在启动 Mysql服务无法启动 服务没有报告任何错误 二、原因 由于mysql的默认端口是3306&#xff0c;因此在启动服务的时候&#xff0c;如果此端口被占用&#xff0c;就会出…

Stable Diffusion 系列教程 | 打破模型壁垒

目录 1.模型基本分类 1.1 CheckPoint 大模型/底模型/主模型 1.2 VAE美化模型/变分自编码器 1.3 HyperNetwork 超网络 1.4 embeddings&#xff08;/Textual Inversion&#xff09; 嵌入式向量 1.5 loRa 低秩适应模型 2. 下载途径和渠道 2.1 C站 2.1.1 如何筛选到自己需…

攻防世界-Web_php_include

原题 解题思路 php://被替换了&#xff0c;但是只做了一次比对&#xff0c;改大小写就可以绕过。 用burp抓包&#xff0c;看看有哪些文件 flag明显在第一个PHP文件里&#xff0c;直接看

psycopg2 使用ThreadedConnectionPool 工具封装

psycopg2 介绍 psycopg2库介绍: Psycopg2是一个用于Python编程语言的第三方库&#xff0c;用于访问PostgreSQL数据库系统。它提供了一组工具和方法&#xff0c;可以轻松地在Python程序中进行数据库操作&#xff0c;包括查询、插入、更新、删除等操作。 以下是Psycopg2库的一些…

主程技术分享: 游戏项目帧同步,状态同步如何选

网络游戏开发项目中帧同步,状态同步如何选&#xff1f; 网络游戏的核心技术之一就是玩家的网络同步,主流的网络同步有”帧同步”与”状态同步”。今天我们来分析一下这两种同步模式。同时教大家如何在自己的项目中采用最合适的同步方式。接下来从以下3个方面来阐述: 对啦&…

基于swing的图书借阅管理系统java jsp书馆书籍信息mysql源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于swing的图书借阅管理系统 系统有2权限&#xff1…