对照JAVA学习Rust(07)--类和结构体

2023-05-16

1、Java类和Rust结构体

     对象体结构,Java的类定义可包括属性和函数,或常量。而Rust 结构体里只有属性字段,函数需要在关联到架构体使用impl 结构体名如以下例子。

JavaRust

public class Rectangle{
   public int width;
   public int height,
   public int area(){
     return this.width* this.height;
   }
}  

struct Rectangle {
    width: u32,
    height: u32,
}
   
impl Rectangle { fn area(&self) -> u32 {
        self.width * self.height
    }
} 
  

default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。

private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)

public : 对所有类可见。使用对象:类、接口、变量、方法

protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)

Rust 中有两种简单的访问权:公共(pub)

私有(即默认,什么也不写)。

2、对象内的方法和函数

在Rust的定义绑定的函数和方法,区别是带&self 参数,如下showlog函数和show的方法的区别:

pub struct NetUtils{
    uid:u64
}
impl NetUtils{
    pub fn new() -> NetUtils {
        return NetUtils {uid:100};
    }
    pub fn showLog(&self,name:String){
        println!("{} = {}",name,self.uid);
    }

    pub fn show( name:String){
        println!("{} ",name);
    }
}

对照Java的规范,Rust 通过&self 可使用对象字段,类似Java的this.属性。

3、构造函数

JavaRust

(1)子类只调用父类的默认(缺省)构造函数,即无形参构造函数。如果父类没有默认构造函数,那子类不能从父类调用默认构造函数。

(2)子类从父类处调用默认构造函数,不能成为子类的默认构造函数。

(3)在创建对象时,先调用父类默认构造函数对对象进行初始化,然后调用子类自身自己定义的构造函数。

(4)如果子类想调用父类的非默认构造函数,则必须使用super来实现。

(5)子类必须调用父类的构造函数。可以通过系统自动调用父类的默认构造函数,如果父类没有默认构造函数时,子类构造函数必须通过super调用父类的构造函数。

Rust不存在构造函数,但可以在结构体新增一个或多个方法在该结构体里创建结构体的对象。如

pub struct NetUtils{

uid:u64

}

impl NetUtils{

pub fn new() -> NetUtils {

     return NetUtils {uid:100};

}

pub fn new2(uid_value:u64) -> NetUtils {

    return NetUtils {uid:uid_value};

}

}

4、函数重载

Java 函数重载是在同一个类中,允许存在一个以上的同名函数,只要他们的参数个数或者参数类型不同即可。重载的特点是与返回型无关,只看参数列表。

Rust 不支持重载,但可以通过其他特性实现类似能力。如:1、泛型函数;2、泛型函数需要函数体中用到的泛型类型需要具有共同的方法,因此需要定义必要的 trait。我写了个例子,左值自动推断代码如下:

trait MakeValue<T> {
    fn make_value() -> T;
}

impl MakeValue<i32> for i32 {
    fn make_value() -> i32 {
        123
    }
}

impl MakeValue<String> for String {
    fn make_value() -> String {
        "123".into()
    }
}

fn foo<T: MakeValue<T>>() -> T {
    T::make_value()
}

fn main() {
    let x: i32 = foo();
    println!("{:?}", x);
    let x: String = foo();
    println!("{:?}", x);
}

5、继承

Java 通过externs 关键词,实现继承父类。Rust实现继承目前找到两种方式 ,一种使用AsRef trait,一种使用Deref trait,都能实现单继承,而AsRef则能实现类似多继承的功能。

6、函数重写

Rust不支持对父结构体的继承,只能实现trail的函数。

7、对象释放

Rust 区别与Java/C++等高级语言的重要特征,在于其内存管理的两个特点:

(1)变量超出作用域会自动释放。对于简单值类型的栈内存(如int,struct)超出作用域后自动释放。而对于 new 出来的堆内存,在c/c++中是要手动释放的,在java要委托垃圾回收释放。而垃圾回收不是实时的,会影响性能。而 Rust 对栈内存和堆内存一视同仁,超出作用域一律自动释放。Rust 的这个特点在兼顾性能的情况下、有效的减少了代码量和内存泄漏隐患。

(2) “所有权” :某段内存只能被最后的变量名所有,前面声明过的变量都作废,这有效的避免被多个变量释放的问题,而且该操作是在编译期就可以检查到的,这策略可在编译期就能有效的避免空指针问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对照JAVA学习Rust(07)--类和结构体 的相关文章

  • NVDIA Jetson TX2软件介绍

    介绍 JETSON TX2 模块 它是一台基于 NVIDIA Pascal 架构的 AI 单模块超级计算机 它性能强大 xff0c 但外形小巧 xff0c 节能高效 xff0c 非常适合机器人 无人机 智能摄像机和便携医疗设备等智能终端设备
  • 12.6V/8.4V锂离子或锂聚合物电池充电器

    AL1261是一款专门为高精度的线性锂电池充电器而设计的电路 xff0c 非常适合那些低成本 便携式的充电器使用 它集高精度预充电 恒定电流充电 恒定电压充电 电池状态检测 充电结束低泄漏 充电状态指示等性能于一身 xff0c 可以广泛地使
  • import requests ModuleNotFoundError: No module named 'requests'

    错误描述 xff1a import requests ModuleNotFoundError No module named 39 requests 39 解决办法 xff1a Step 1 xff1a 打开命令窗口 xff0c Win 4
  • UITableViewController

    UITableViewController 表视图控制器 UITableViewController继承自UIViewController 自带了一个tableView 其根视图就是tableView 创建UIViewVontroller运
  • stm32开发板点亮led遇到问题

    最近由于毕业设计是四旋翼无人飞行器的系统设计 xff0c 在学STM32F103R8 xff0c 学长自己设计的一块板子 xff0c 让我根据野火的教程一步一步做 xff0c 先熟悉一下板子的工作原理 xff0c 为以后编程控制电机转速做准
  • Debian Linux 的安装

    Debian Linux 的安装 作者 xff1a Grey 原文地址 xff1a 博客园 xff1a Debian Linux 的安装 CSDN xff1a Debian Linux 的安装 说明 本安装说明是基于 Windows 10
  • 基于pytest设计自动化测试框架实战

    简介 基于pytest实现测试用例收集方案 自定义参数化方案 页面元素定位数据存储方案 测试用例数据存储和维护方案 xff0c 这样可直接进入到设计编写测试用例业务代码阶段 xff0c 避免重复设计这些方案以及方案不统一导致维护复杂 困难的
  • windows安全模型--令牌(token)和安全描述符

    当一个程序访问一个资源时 xff0c 需要有相应的访问权限 windwos安全模型中 xff0c 有两个角色 xff0c 一个就是访问者 xff08 进程 xff09 xff0c 一个是被访问者 xff08 资源 xff09 资源 xff0
  • firefox查找插件和插件媒体类型的方法

    firefox从两个位置加载插件 xff0c 并查找插件对应的媒体类型 xff08 mimetype xff09 1 安装目录的plugins文件夹下 可以直接把一个插件的dll放到plugins目录下 xff0c 该插件对应的媒体类型 x
  • Windows内存机制的问与答

    学习windows内存管理过程中 xff0c 会先有些疑问 xff0c 然后在不断学习中得到解答 xff0c 解答也是基于我的不断理解 xff0c 未必完全正确 下面记录一些 一 如果一个内存页没有被修改过 xff0c 操作系统可以直接释放
  • Python中if语句的使用方法

    if语句用来表示某种可能的情况 xff0c 并如何处理该情况 if语句可以用来表示一种可能性 两种可能性或者多种可能性 1 一种可能性 单个的if语句表示一种可能性 xff0c if关键字后面跟着表达式 xff0c 当表达式是True时 x
  • [Util]-VSCode+WSL开发环境

    文章目录 WSL升级到WSL2安装编译环境相关命令 VSCode快捷键书签代码折叠 配置文件C 43 43 格式化 远程linux 调试程序启动调试变量查看print打印display追踪x内存 变量监控 VSCode是非常流行的代码编辑器
  • 用递归方法求n的阶乘(C语言)

    用递归方法求n xff01 include lt stdio h gt int main int n int y printf 34 input a integer number 34 scanf 34 d 34 amp n y 61 fa
  • ./nginx: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No suc

    span class token function ln span s usr local lib64 libssl so 1 1 usr lib64 libssl so 1 1 span class token function ln s
  • RootCause深度分析:为什么DCache常会导致LCD显示异常(数据一致性问题)

    DCache导致LCD显示异常RootCause深度分析 问题描述 xff1a L1 L2 Cache简介问题分析 xff1a 问题解决 xff1a 如何编程 xff1a InvalideCleanHyperRAM xff1a Cache
  • FreeRTOS内核笔记(一):基本知识和命名规则

    FreeRTOS内核笔记 xff08 一 xff09 xff1a 基本知识和命名规则 FreeRTOS内核笔记命名规则 xff1a 常用宏定义Thread运行状态 xff1a RTOS TickContext切换 xff1a 实时调度器Sc
  • pyttsx3 快速上手之:语音合成播报

    Python pyttsx3 快速上手之 xff1a 语音合成播报 安装 pyttsx3 xff1a API封装API使用博主热门文章推荐 xff1a pyttsx3 是python中最常用的文字转语音库 xff0c 使用方便 xff0c
  • FreeRTOS内核:详解Task各状态(GPT4帮写)

    FreeRTOS内核 xff1a 详解Task各状态 xff08 GPT4帮写 xff09 1 背景2 Task顶层状态区分3 运行状态 xff08 Running xff09 4 非运行状态4 1 阻塞态 xff08 Blocked xf
  • FreeRTOS内核:详解Queue队列 FIFO(GPT4帮写)

    FreeRTOS内核 xff1a 详解队列管理FIFO 1 背景2 Queue相关API2 1 xQueueCreate xff1a 创建2 2 xQueueSend xff1a 发送2 3 xQueueReceive xff1a 接收2
  • 浏览器玩转机器学习之:Teachable Machine (图像/语音/姿态识别)

    Teachable Machine xff1a 浏览器玩转机器学习 图像 语音 姿态识别 简介 xff1a 先上图 xff1a 快速上手 xff1a 新建项目准备数据Model训练Model运行Model导出 对于语音和姿态识别源码Gith

随机推荐