Scala(三):類

来源:https://www.cnblogs.com/strugglingonlydata/archive/2018/12/17/10129435.html
-Advertisement-
Play Games

2.帶getter和setter屬性 3.對象私有欄位 在Scala中,方法可以訪問該類的所有對象的私有欄位 4.Bean屬性 當你將Scala欄位標註為@BeanProperty時,會自動生成四個方法 5.輔助構造器 6.主構造器 7.嵌套類 ...


類:Class
1.簡單類和無參方法
2.帶getter和setter屬性
3.只帶getter屬性
4.對象私有欄位
5.Bean屬性
6.輔助構造器
7.主構造器
8.嵌套類
1.簡單類和無參方法
Scala中的簡單類和Java中很相似
class ClassOps{
  private var value = 0 //你必須初始化欄位

  def  increment(){value += 1} //方法預設是公有的

  def current() = value

}
/*
   *在Scala中類並不聲明為public,,Scala源文件包括多個類,所以這些類都具有公共可見性
   * 使用該類需要做的就是構造對象並按照通常的方式調用方法
   */

object Class {
  def main(args: Array[String]): Unit = {
    val myCounter = new ClassOps
    myCounter.increment()
    println(myCounter.current)//此處調用無參構造時,()可加也可不加


  }
}

2.帶getter和setter屬性

/**
 *public class Person{
 *     public Int age  //Java中並不推薦這樣使用
 *     private String name
 *     public String getName(){return name;}
 *     public void setName(String name){this.name=name}
 *}
 * 像這樣一對getter/setter通常叫做屬性(property)
 * Scala中對每個欄位都給生成getter/setter方法,不過我們可以控制這個過程
 *    如果欄位私有,則getter/setter也是私有的
 *    如果欄位被val修飾,那麼只有getter生成
 *    如果你不需要getter/setter,那麼可以將欄位聲明為private[this]
 */
//Scala中每個欄位都提供getter和setter方法
class Person{
 // var age = 0
  /*
   *Scala生成面向JVM的類,其中有一個私有欄位age欄位和相應的getter/setter方法,
   *在Scala中此處,getter和setter分別為age和age_=
   */
  //重寫getter和setter
  private var privateAge = 0 //變成私有並改名
  def age = privateAge       //getter

  def age_(newValue : Int ){ //setter方法
    if(newValue > privateAge) privateAge = newValue
  }
}
object Person{
  def main(args: Array[String]): Unit = {
    val p = new Person
    println(p.age)

    p.age_(40)
    println(p.age)   //列印結果:40
    p.age_(30)
    println(p.age)   //列印結果:40
  }
}

3.對象私有欄位

 在Scala中,方法可以訪問該類的所有對象的私有欄位

class atm{
  private var momey = 0
  def drawMoney(){momey += 1}
  def spendMoney(other : atm) = momey < other.momey
  //之所以訪問other.money是合法的是因為other也是atm對象
  //Scala允許我們定義更加嚴格的訪問限制,通過private[this]
  private[this] var foods = null //在這對象.value行不通
  //類私有欄位,Scala會生成私有getter/setter,但是對象私有的欄位不會生成
  //private[類名],這樣的只有指定類才能訪問

}

4.Bean屬性

  當你將Scala欄位標註為@BeanProperty時,會自動生成四個方法

import scala.reflect.BeanProperty
class superMan{

  @BeanProperty var name : String  = _

}
/*
 *將會生成如下四個方法:
 * name :String
 * name_=(newValue:String):Unit
 * getName():String
 * setName(newValue:String):Unit
 */

5.輔助構造器

 Scala中有主構造器和輔助構造器
輔助構造器和Java中的構造器很相似,只有兩處不同
1.輔助構造器名稱是this,Java中構造器名和類名相同
2.每一個輔助構造器必須以一個先前已定義的其他輔助構造器或主構造器的調用開始
class SuperWoman{
    private var name = ""
    private var age = 0

    def this(name:String ) {
      this()    //調用主構造器
      this.name=name
    }
    def this(name :String ,age :Int){
      this(name)         //調用前一個輔助構造器
      this.age=age
    }
     //一個類中沒有顯式的定義主構造器,那麼會預設的定義一個無參的主構造器
  
}

object superWoman {
          //三種方式構建對象
  val s1 = new SuperWoman
  val s2 = new SuperWoman("John")
  val s3 = new SuperWoman("John",30)
}

6.主構造器

在Scala中,每個類都有主構造器,主構造器並不以this方法定義,而是與類定義交織在一起
主構造器的參數被編譯成欄位,其值被初始化成構造時傳入的參數
在Scala中,類也接受參數,和方法一樣
class SuperBoy(val name:String,val age:Int){
  //(...)中的內容就是主構造器的參數
  println("this is construct")

  override def toString = s"SuperBoy($name, $age)"
}
//構造參數也可以是普通的方法參數,不帶val或者var,這樣的參數如何處理取決於它們在類中如何被使用
//如果不帶val或者var的參數至少被一個方法使用,它將被升級為欄位
class SuperGirl(name:String,age:Int){
  def description=name + "is" + age + "years old"
}
//上述代碼聲明並初始化了不可變欄位name和age,而這兩個欄位都是對象私有的,類似於private[this]
//當你把主構造器的參數看做是類參數時,不帶val或var的參數就變得易於理解了,這樣的參數的作用域覆蓋整個類,因此你可以在方法中使用,同時
//你這樣做了,編譯器自動幫你將它保存成欄位
//如果你想把主構造器變為私有,如下
class OldMan private(val name:String,val age:Int){}//這樣只能通過輔助構造器來創建對象

7.嵌套類

 函數中定義函數,類中定義類
import scala.collection.mutable.ArrayBuffer 
class NetWork{
   class Member(val name:String){
     val contacts = new ArrayBuffer[Member]()
   }
  private val Members=new ArrayBuffer[Member]()

  def join(name:String)={
        val m =new Member(name)
        Members += m
        m
  }
}
object NetWork{
  def main(args: Array[String]): Unit = {
    //如有如下兩個網路
    val chatter = new NetWork
    val myFace= new NetWork
    //在兩個網路中添加成員
    val fred=chatter.join("fred")
    val wilma=chatter.join("wilma")
    fred.contacts += wilma
    val barney = myFace.join("barney")
    //fred.contacts += barney 不允許這樣做
    /*
     *如果你不希望是這個效果,兩種方式解決
     *   1.可以將Member類移動到NetWork的伴生對象中
     *   2.使用類型投影:NetWork#Member
     *    eg :
     *        class NetWork{
     *           class Member(val name:String){
     *             val contacts = new ArrayBuffer[NetWork#Member]()
     *            }
     *           }
     */
      //在內嵌類中,可以通過外部類.this的方式來訪問內部類的this引用,和Java一樣
  }
}

 

提示:有不妥的地方希望大家能夠批評指正,一起學習,一起進步

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Vue.js for IntelliJ IDEA-based IDEsThis plugin provides support for Vue.js in IntelliJ IDEA Ultimate, WebStorm, PhpStorm, PyCharm Professional and Rub... ...
  • 第一套 、 1 . 下述關於迴圈語句的描述中,( B)是錯誤的 A.迴圈體內可以包含有迴圈語句 B.迴圈體內必須同時出現break語句和continue語句 C.迴圈體內可以出現條件語句 D.迴圈體可以是空語句,即迴圈體中只出現一個分號 2 . 下列定義中是有效字元串的是(B ) A.""what ...
  • Bootstrap -- 插件: 提示工具、彈出框、 警告框消息 ...
  • [TOC] 本篇是內部培訓交流會的摘要總結。 培訓PPT 和 示例代碼 已托管至我的github倉庫: "https://github.com/dashnowords/blogs/tree/master/Demo/rebuild angularjs controller" 一. 結構拆分 1. 小型 ...
  • pygame製作"停不下來的奧爾加團長"小游戲 一、pygame簡介 Pygame 是一組用來開發游戲軟體的 Python 程式模塊,基於 SDL 庫的基礎上開發。允許你在 Python 程式中創建功能豐富的游戲和多媒體程式,Pygame 是一個高可移植性的模塊可以支持多個操作系統。用它來開發小游戲 ...
  • 工廠模式 一:簡單工廠模式 1. 問題的引出 我們打算做一個製作pizza的系統,從訂購到出貨,初始代碼如下: 客戶端通過調用pizza類的orderPizza方法來創建pizza,根據type的不同來獲取不同種類的pizza,然而以上的設計存在著很多問題: 1. Pizza類中存在大量的if el ...
  • 《設計模式:可復用面向對象軟體基礎》 這本書還沒看完,但是絕對是案頭必備,雖然用C++寫的代碼,並且是四個牛人寫的風格(相關知識背景與程式員不同),但是一旦開始理解設計模式以後,再回過頭會發現這本書的定義和描述最容易理解和記憶。 《Head First設計模式》 自學、初學的推薦用書。我也是通過這本 ...
  • 原文鏈接:SAP ABAP7.50系列之預定義數據結構 公眾號:SAP Technical 前言部分 先說一下,之前有些文章被轉載之後也沒有註明,這個就比較不好。如果你覺得本文寫的並不好,那麼可以直接去看HELP,這樣更直接,我這裡只是做記錄,如果讀者朋友感興趣,可以關註公眾號,也可以在本文末留言, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...