對(duì)象體結(jié)構(gòu),Java的類定義可包括屬性和函數(shù),或常量。而Rust 結(jié)構(gòu)體里只有屬性字段,函數(shù)需要在關(guān)聯(lián)到架構(gòu)體使用impl 結(jié)構(gòu)體名如以下例子。
成都創(chuàng)新互聯(lián)專注于二七企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,成都做商城網(wǎng)站。二七網(wǎng)站建設(shè)公司,為二七等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站制作,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)Java | Rust |
---|---|
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?(即默認(rèn),什么也不寫): 在同一包內(nèi)可見,不使用任何修飾符。使用對(duì)象:類、接口、變量、方法。 private?: 在同一類內(nèi)可見。使用對(duì)象:變量、方法。?注意:不能修飾類(外部類) public?: 對(duì)所有類可見。使用對(duì)象:類、接口、變量、方法 protected?: 對(duì)同一包內(nèi)的類和所有子類可見。使用對(duì)象:變量、方法。?注意:不能修飾類(外部類)。 | Rust 中有兩種簡(jiǎn)單的訪問權(quán):公共(pub) 私有(即默認(rèn),什么也不寫)。 |
在Rust的定義綁定的函數(shù)和方法,區(qū)別是帶&self 參數(shù),如下showlog函數(shù)和show的方法的區(qū)別:
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);
}
}
對(duì)照J(rèn)ava的規(guī)范,Rust 通過&self 可使用對(duì)象字段,類似Java的this.屬性。
3、構(gòu)造函數(shù)Java | Rust |
---|---|
(1)子類只調(diào)用父類的默認(rèn)(缺省)構(gòu)造函數(shù),即無形參構(gòu)造函數(shù)。如果父類沒有默認(rèn)構(gòu)造函數(shù),那子類不能從父類調(diào)用默認(rèn)構(gòu)造函數(shù)。 (2)子類從父類處調(diào)用默認(rèn)構(gòu)造函數(shù),不能成為子類的默認(rèn)構(gòu)造函數(shù)。 (3)在創(chuàng)建對(duì)象時(shí),先調(diào)用父類默認(rèn)構(gòu)造函數(shù)對(duì)對(duì)象進(jìn)行初始化,然后調(diào)用子類自身自己定義的構(gòu)造函數(shù)。 (4)如果子類想調(diào)用父類的非默認(rèn)構(gòu)造函數(shù),則必須使用super來實(shí)現(xiàn)。 (5)子類必須調(diào)用父類的構(gòu)造函數(shù)。可以通過系統(tǒng)自動(dòng)調(diào)用父類的默認(rèn)構(gòu)造函數(shù),如果父類沒有默認(rèn)構(gòu)造函數(shù)時(shí),子類構(gòu)造函數(shù)必須通過super調(diào)用父類的構(gòu)造函數(shù)。 | Rust不存在構(gòu)造函數(shù),但可以在結(jié)構(gòu)體新增一個(gè)或多個(gè)方法在該結(jié)構(gòu)體里創(chuàng)建結(jié)構(gòu)體的對(duì)象。如 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}; } } |
Java 函數(shù)重載是在同一個(gè)類中,允許存在一個(gè)以上的同名函數(shù),只要他們的參數(shù)個(gè)數(shù)或者參數(shù)類型不同即可。重載的特點(diǎn)是與返回型無關(guān),只看參數(shù)列表。
Rust 不支持重載,但可以通過其他特性實(shí)現(xiàn)類似能力。如:1、泛型函數(shù);2、泛型函數(shù)需要函數(shù)體中用到的泛型類型需要具有共同的方法,因此需要定義必要的 trait。我寫了個(gè)例子,左值自動(dòng)推斷代碼如下:
trait MakeValue{
fn make_value() ->T;
}
impl MakeValuefor i32 {
fn make_value() ->i32 {
123
}
}
impl MakeValuefor String {
fn make_value() ->String {
"123".into()
}
}
fn foo>() ->T {
T::make_value()
}
fn main() {
let x: i32 = foo();
println!("{:?}", x);
let x: String = foo();
println!("{:?}", x);
}
5、繼承Java 通過externs 關(guān)鍵詞,實(shí)現(xiàn)繼承父類。Rust實(shí)現(xiàn)繼承目前找到兩種方式 ,一種使用AsRef trait,一種使用Deref trait,都能實(shí)現(xiàn)單繼承,而AsRef則能實(shí)現(xiàn)類似多繼承的功能。
6、函數(shù)重寫Rust不支持對(duì)父結(jié)構(gòu)體的繼承,只能實(shí)現(xiàn)trail的函數(shù)。
7、對(duì)象釋放Rust 區(qū)別與Java/C++等高級(jí)語言的重要特征,在于其內(nèi)存管理的兩個(gè)特點(diǎn):
(1)變量超出作用域會(huì)自動(dòng)釋放。對(duì)于簡(jiǎn)單值類型的棧內(nèi)存(如int,struct)超出作用域后自動(dòng)釋放。而對(duì)于 new 出來的堆內(nèi)存,在c/c++中是要手動(dòng)釋放的,在java要委托垃圾回收釋放。而垃圾回收不是實(shí)時(shí)的,會(huì)影響性能。而 Rust 對(duì)棧內(nèi)存和堆內(nèi)存一視同仁,超出作用域一律自動(dòng)釋放。Rust?的這個(gè)特點(diǎn)在兼顧性能的情況下、有效的減少了代碼量和內(nèi)存泄漏隱患。
(2)?“所有權(quán)” :某段內(nèi)存只能被最后的變量名所有,前面聲明過的變量都作廢,這有效的避免被多個(gè)變量釋放的問題,而且該操作是在編譯期就可以檢查到的,這策略可在編譯期就能有效的避免空指針問題。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧