[轉載] Scala繼承與Java的區別

參考鏈接: Java中將final與繼承一起使用

在之前的筆記Java靜態屬性和方法的繼承問題中,通過具體的實驗證明,在子類中重寫父類的字段時并沒有覆蓋父類的字段,只是隱藏了父類的字段。而在scala中則不同,scala子類的同名字段會重寫且覆蓋父類的同名字段,這里做了個簡單實驗,并記錄下來。?

Parent.scala?

class Parent {

? val normalStr: String = "Normal member of parent."

?

? def normalMethod() = {

? ? println("Normal method of parent.")

? }

}?

定義了一個字段normalStr和一個方法normalMethod(),在Scala中,類的字段是由一個私有屬性和對應的getter/setter方法組成的。?

Child.scala?

class Child extends Parent {

? override val normalStr: String = "Normal member of child."

?

? override def normalMethod() = {

? ? println("Normal method of child.")

? }

}?

子類Child繼承了父類Parent,并override父類的normalStr和normalMethod()。?

TestMain和Result?

object TestMain{

? def main(args: Array[String]) {

? ? val child: Child = new Child

? ? println(child.normalStr)

? ? child.normalMethod()

?

? ? //val child1:Parent = child.asInstanceOf[Parent]

? ? //采用Parent類型的變量指向創建的Child對象

? ? val child1:Parent = new Child

? ? println(child1.normalStr)

? ? child1.normalMethod()

? }

}?

輸出的結果如下:?

Normal member of child.

Normal method of child.

Normal member of child.

Normal method of child.?

從結果可以看出,子類重寫并覆蓋了父類的同名屬性和方法?

Scala子類的構造順序?

這里順便記錄下Scala子類的構造順序,這里直接用書上給出的例子,以便后續查看:?

先寫兩個類,一個父類Creature.scala,一個子類Ant.scala:?

Creature?

class Creature {

? ? val range: Int = 10

? ? val env: Array[Int] = new Array[Int](range)

? ? def show(): Unit = {

? ? ? ?println(range)

? ? }

}?

Ant?

class Ant extends Creature {

? ? override val range = 2

}?

現在創建一個Ant的對象ant,那么ant.env.length的值是多少,憑第一感覺應該是10或者2,然而答案是0,接下來我寫下ant創建的過程中構造器的運行順序:?

首先調用父類Creature的構造器(父類的構造器先于子類的構造器被調用),所以首先把range設置為10。為了后續的說明這里說明下,類的字段是由一個私有屬性和對應的getter和setter方法組成的,而子類在重寫父類的同名字段時,對于val類型的屬性子類重寫了getter方法。接下來初始化env數組,所以需要調用range的getter方法,然而子類已經重寫了getter方法,且子類并沒初始化,所有的字段都是對象創建過程中,內存清零后的默認值,所以此時range的值為0。這也就解釋了上述問題的疑問。接下來調用子類的構造器,range被設為2。?

所以在構造器中,對象的初始化不應該依賴于val的值,因為val的值對應的getter方法可能會被子類重寫覆蓋。解決辦法有:?

將val聲明為final。(簡單高效,但是不夠靈活)在超類中將val聲明為lazy。(簡單靈活,但是不夠高效)還有種就是子類中使用提前定義語法。(這個就不介紹了)?

ant對象調用show()方法輸出的則是子類range的值,即為2。而在Java中,則是父類的range的值:10。主要原因還是由于在Scala中,子類重寫父類的屬性或者方法,覆蓋了父類的屬性和方法,而在Java中,只有非靜態的方法會被子類重寫覆蓋,而非靜態/靜態屬性和靜態方法都只是被隱藏了。?

主要參考:《快學Scala》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540279.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540279.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540279.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Source Map調試壓縮后代碼

在前端開發過程中,無論是樣式還是腳本,運行時的文件可能是壓縮后的,那這個時候調試起來就很麻煩。 這個時候,可以使用Source Map文件來優化調試,Source Map是一個信息文件,里面儲存著原代碼位置信息&#x…

[轉載] Python3十大經典錯誤及解決辦法

參考鏈接: Python中的關鍵字2 ◆ ◆ ◆ ◆ ◆ 接觸了很多Python愛好者,有初學者,亦有轉行人。不論大家學習Python的目的是什么,總之,學習Python前期寫出來的代碼不報錯就是極好的。下面,嚴小樣兒為大家羅…

兩臺電腦間大量數據拷貝的快捷方法

可能大家會遇到需要將一臺電腦里的數據拷貝到另外一臺電腦,最常用的方法是用u盤或移動硬盤等存儲設備來拷貝,這樣速度慢,而且可能拷貝多次才能將數據拷貝完。現提供一種方法,就是通過windows 的文件共享來實現。通過千兆網線直接連…

[轉載] 使用 Web 標準生成 ASP.NET 2.0 Web 站點

參考鏈接: 使用super訪問Java祖父母的成員 Stephen WaltherSuperExpert.com 適用于: Microsoft ASP.NET 2.0 (Beta 2) Microsoft Visual Studio .NET 2005 Microsoft Visual Web Developer 摘要: Microsoft ASP.NET 2.0 具有很多有用的功能…

Office快捷鍵大全之三(Access快捷鍵下篇)

向下鍵 向某幫助主題的末尾滾動 Page Up 以較大增量向某幫助主題的開頭滾動 Page Down 以較大增量向某幫助主題的末尾滾動 Home 移到某幫助主題的開頭 End 移到某幫助主題的末尾 CtrlP 打印當前幫助主題 CtrlA 選定整個幫助主題 CtrlC 將選定項復制到"剪貼…

[轉載] 如何在Android設備之間共享Google Play應用,音樂等

參考鏈接: 使用super訪問Java祖父母的成員 We recently showed you how to configure your iOS devices for app and media sharing; more than a few people wrote in asking how to do the same thing with Google Play purchases. Read on as we dig into how t…

linux 高性能讀書筆記之通用socket地址

####socket網絡編程接口 socket的地址是結構體sockaddr 代碼如下 struct sockaddr{ sa_family_t sa_family; char sa_data[14]; } sa_family 成員是地址族類型(sa_family_t)變量。地址族類型通常與協議族類型對應 1.二者對應表 協議族地址表描述PF_UNIXAF_UNIXUNIX本…

[轉載] JAVA面向對象之代碼塊 繼承 方法的重寫 super關鍵字與重寫toString()方法介紹

參考鏈接: 可以重寫Java中的私有方法嗎 JAVA面向對象之代碼塊與繼承 代碼塊分類 局部代碼塊 作用:限制變量生命周期 書寫位置:在方法中 構造代碼塊 開發中很少使用 書寫位置:類中 方法外 調用時機:如果你有構造代碼塊 系統會幫你調用 幫你在創建對象…

struts2中s:select標簽的使用

轉自&#xff1a;https://www.cnblogs.com/Sara-shi/archive/2013/03/13/struts2_select.html 1 靜態生成 <s:select name"user.sex" list"#{0:男,1:女}" label"性別" headerKey"" headerValue"請選擇性別"></s:se…

[轉載] JAVA面試題大全(part_1)

參考鏈接&#xff1a; 對Java中派生類方法更嚴格的訪問 JAVA面試題大全(part_1) 1、面向對象的特征有哪些方面 (1)抽象&#xff1a; 抽象就是忽略一個主題中與當前目標無關的那些方面&#xff0c;以便更充分地注意與當前目標有關的方面。抽象并不打算了解全部問題&#xf…

使用mysqladmin命令修改MySQL密碼與忘記密碼

修改密碼&#xff1a; 1.例如你的 root用戶現在沒有密碼&#xff0c;你希望的密碼修改為123456&#xff0c;那么命令是&#xff1a; mysqladmin -u root password 123456 2.如果你的root現在有密碼了&#xff08;123456&#xff09;&#xff0c;那么修改密碼為abcdef的命令是&a…

[轉載] java面試100問+參考答案

參考鏈接&#xff1a; 對Java中派生類方法更嚴格的訪問 1、面向對象的特征有哪些方面 (1).抽象&#xff1a; 抽象就是忽略一個主題中與當前目標無關的那些方面&#xff0c;以便更充分地注意與當前目標有關的方面。抽象并不打算了解全部問題&#xff0c;而只是選擇其中的…

工作所用的模塊回滾腳本

俗話說的好&#xff1a;“真男人從來不回滾”&#xff0c;但是家中常備一個回滾腳本也是很有必要的&#xff0c;我所在公司的服務器模塊名都是在初始化的時候寫進/etc/role_install這個文件里&#xff0c;如下圖的這個服務器就是fss服務器&#xff1a; 再比如下面這個服務器&am…

Linux服務器性能評估與優化

一、影響Linux服務器性能的因素 1. 操作系統級 CPU 內存 磁盤I/O帶寬 網絡I/O帶寬 2. 程序應用級 二、系統性能評估標準影響性能因素評判標準好壞糟糕CPUuser% sys%< 70%user% sys% 85%user% sys% >90%內存Swap In&#xff08;si&…

[轉載] Java序列化的幾種方式以及序列化的作用

參考鏈接&#xff1a; Java中帶有繼承的對象序列化 文章轉載自&#xff1a; 本文著重講解一下Java序列化的相關內容。 如果對Java序列化感興趣的同學可以研究一下。 一.Java序列化的作用 有的時候我們想要把一個Java對象變成字節流的形式傳出去&#xff0c;有的時候我們…

nginx 非80、443端口跳轉到80、443

其實很簡單: 123if ($server_port ! 80 ) { rewrite ^/(.*)$ http://$host/$1 permanent; }舉一反三。。。 123if ($server_port ! 443 ) { rewrite ^/(.*)$ https://$host/$1 permanent; }123if ($host ! host ) { rewrite ^/(.*)$ http://host/$1 permanent; }本文轉自 ninny…

[轉載] 一文徹底搞懂父類引用指向子類對象問題

參考鏈接&#xff1a; 用子類引用子類對象 vs 父類引用 public class Father { private String name; private int age; private int weight; public void eat() { System.out.println("Father is eating"); } private void run() { System.out.println("Runin…

把控站外seo效果的幾個操作點

把控站外seo效果的幾個操作點 實際上&#xff0c;站外的seo不僅僅是外鏈這么簡單&#xff0c;還包括用戶行為&#xff08;點擊&#xff09;&#xff0c;品牌詞曝光等工作。大部分情況下&#xff0c;我們所說的站外優化就是發外鏈。本文就外鏈相關事宜&#xff0c;講解些許操作點…

[轉載] 【C語言】fopen C4996錯誤解決

參考鏈接&#xff1a; C和C#重載可以與繼承一起使用嗎 C4996 fopen: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 解決方案&#xff1a;添加宏定…

Quartus II 8.1 詳解--有圖---圖片詳解 【1講】

Quartus II 8.1 詳解--有圖---圖片詳解 看圖片比較清楚&#xff0c;比文章清楚的多 本文轉自 zhangguangyi 51CTO博客&#xff0c;原文鏈接http://blog.51cto.com/bosszhang/808019: