Rust 学习笔记 - 面向对象,java分布式开发面试题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

调用对象外部的代码无法直接访问对象内部的实现细节,唯一可以与对象进行交互的方法就是通过它公开的 API。

pub 关键字决定哪些方法、属性是公开的,其它的默认都是私有的,这就是 Rust 实现封装这个特性的方法。

继承

使对象可以沿用另外一个对象的数据和行为,且无需重复定义相关代码。

Rust 是没有继承的。

通常需要使用继承的原因:

  • 代码复用:Rust 中用默认 trait 方法来进行代码共享

  • 多态:Rust 中使用泛型和 trait 约束(限定参数化多态 bounded parametric)来实现多态

很多新语言都不适用继承作为内置的程序设计方案了。

实例

创建一个 GUI 工具:它会遍历某个元素的列表,依次调用元素的 draw 方法进行绘制,例如: Button、TextField 等元素。

在面向对象语言里:定义一个 Component 父类,里面定义了 draw 方法,定义 Button、TextField 等类,继承于 Component 类。

使用 Rust 来实现的话,方法就会有一些不一样。

为共有行为定义一个 trait

Rust 避免将 struct 或 enum 称为对象,因为它们与 impl 块是分开的。

trait 对象有些类似于其它语言中的对象,因为它们在某种程度上组合了数据与行为。

trait 对象与传统对象又有不同的地方:无法为 trait 对象添加数据。trait 对象被专门用于抽象某些共有行为,它没有其它语言中的对象那么通用。

下面来实现一下这个 GUI 工具:

// lib.rs

pub trait Draw {

fn draw(&self);

}

pub struct Screen {

pub components: Vec<Box>,

}

impl Screen {

pub fn run(&self) {

for component in self.components.iter() {

component.draw();

}

}

}

pub struct Button {

pub width: u32,

pub height: u32,

pub label: String,

}

impl Draw for Button {

fn draw(&self) {

// 绘制一个按钮

}

}

// main.rs

// adder 是 crate 的名称

use adder::Draw;

use adder::{Button, Screen};

struct SelectBox {

width: u32,

height: u32,

options: Vec,

}

impl Draw for SelectBox {

fn draw(&self) {

// 绘制一个选择框

}

}

fn main() {

let screen = Screen {

components: vec![

Box::new(SelectBox {

width: 75,

height: 10,

options: vec![

String::from(“Yes”),

String::from(“Maybe”),

String::from(“No”),

],

}),

Box::new(Button {

width: 75,

height: 10,

label: String::from(“OK”),

}),

]

};

screen.run();

}

动态派发


Trait 对象执行的是动态派发(dynamic dispatch)。

将 trait 约束作用于泛型时,Rust 编译器会执行单态化:编译器会为我们用来替换泛型类型参数的每一个具体类型生成对应函数和方法的非泛型实现。

通过单态化生成的代码会执行静态派发(static dispatch),在编译过程中确定调用的具体方法。

动态派发则无法在编译过程中确定调用的究竟是哪一种方法,编译器会产生额外的代码以便在运行时找出希望调用的方法。

使用 trait 对象,会执行动态派发,产生运行时开销,阻止编译器内联方法代码,使得部分优化操作无法进行。

对象安全


Trait 对象必须保证对象安全,只能把满足对象安全(object-safe)的 trait 转化为 trait 对象。

Rust 采用一系列规则来判定某个对象是否安全,只需记住两条:

  1. 方法的返回类型不是 Self

  2. 方法中不包含任何泛型类型参数

pub trait Clone {

fn clone(&self) -> Self;

}

pub trait Draw {

fn draw(&self);

}

pub struct Screen {

pub components: Vec<Box>,

// 报错:the trait Clone cannot be made into an object consider moving clone to another trait

}

实现一种面向对象的设计模式


状态模式(state pattern)是一种面向对象设计模式:一个值拥有的内部状态由数个状态对象(state object)表达而成,而值的行为则随着内部状态的改变而改变。

使用状态模式意味着:

  • 业务需求变化时,不需要修改持有状态的值的代码,或者使用这个值的代码

  • 只需要更新状态对象内部的代码,以便改变其规则,或者增加一些新的状态对象。

// main.rs

use blog::Post;

fn main() {

let mut post = Post::new();

// 新发布,还未通过审核,所以 content 应该为空

post.add_text(“I ate a salad for lunch today”);

assert_eq!(“”, post.content());

// 审核阶段,所以 content 应该为空

post.request_review();

assert_eq!(“”, post.content());

// 审核通过,content 成功发布出来

post.approve();

assert_eq!(“I ate a salad for lunch today”, post.content());

}

pub struct Post {

state: Option<Box>, // 发布的状态,需要实现 State 这个 trait

content: String,

}

impl Post {

pub fn new() -> Post {

Post {

state: Some(Box::new(Draft {})),

content: String::new(),

}

}

pub fn add_text(&mut self, text: &str) {

self.content.push_str(text);

}

pub fn content(&self) -> &str {

self.state.as_ref().unwrap().content(&self)

}

pub fn request_review(&mut self) {

if let Some(s) = self.state.take() {

self.state = Some(s.request_review())

}

}

pub fn approve(&mut self) {

if let Some(s) = self.state.take() {

最后

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

image

image

其实面试这一块早在第一个说的25大面试专题就全都有的。以上提及的这些全部的面试+学习的各种笔记资料,我这差不多来回搞了三个多月,收集整理真的很不容易,其中还有很多自己的一些知识总结。正是因为很麻烦,所以对以上这些学习复习资料感兴趣

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
转存中…(img-Y3TaSN0T-1713425828916)]

[外链图片转存中…(img-5AlYWiP9-1713425828917)]

其实面试这一块早在第一个说的25大面试专题就全都有的。以上提及的这些全部的面试+学习的各种笔记资料,我这差不多来回搞了三个多月,收集整理真的很不容易,其中还有很多自己的一些知识总结。正是因为很麻烦,所以对以上这些学习复习资料感兴趣

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-8QZVt8X0-1713425828917)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值