2021年大数据常用语言Scala(二十八):scala面向对象 MAVEN依赖和类
目錄
scala面向對象
MAVEN依賴
類 - 掌握
創建類和對象 - 掌握
getter/setter - 了解
類的構造器 - 掌握
scala面向對象
MAVEN依賴
<?xml?version="1.0" encoding="UTF-8"?>
<project?xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.itheima</groupId><artifactId>akka-demo</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.targer>1.8</maven.compiler.targer><encoding>UTF-8</encoding><scala.version>2.11.8</scala.version><scala.compat.version>2.11.8</scala.compat.version></properties><dependencies><!-- https://mvnrepository.com/artifact/org.scala-lang/scala-library --><dependency><groupId>org.scala-lang</groupId><artifactId>scala-library</artifactId><version>${scala.version}</version></dependency><!--<dependency><groupId>com.typesafe.akka</groupId><artifactId>akka-actor_2.11</artifactId><version>2.3.14</version></dependency><dependency><groupId>com.typesafe.akka</groupId><artifactId>akka-remote_2.11</artifactId><version>2.3.14</version></dependency>--></dependencies><build><sourceDirectory>src/main/scala</sourceDirectory><testSourceDirectory>src/test/scala</testSourceDirectory><plugins><plugin><groupId>net.alchim31.maven</groupId><artifactId>scala-maven-plugin</artifactId><version>3.2.2</version><executions><execution><goals><goal>compile</goal><goal>testCompile</goal></goals><configuration><args><!--<arg>-make:transitive</arg>--><arg>-dependencyfile</arg><arg>${project.build.directory}/.scala_dependencies</arg></args></configuration></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>2.4.3</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><filters><filter><artifact>*:*</artifact><excludes><exclude>META-INF/*.SF</exclude><exclude>META-INF/*.DSA</exclude><exclude>META-INF/*.RSA</exclude></excludes></filter></filters><transformers><transformer?implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>reference.conf</resource></transformer><transformer?implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass></mainClass></transformer></transformers></configuration></execution></executions></plugin></plugins></build></project>
學習目標
- 掌握scala類與object的用法
- 掌握繼承的用法
- 掌握trait(特質)的用法
?
類 - 掌握
scala是支持面向對象的,也有類和對象的概念。
?
創建類和對象 - 掌握
?
- 使用class關鍵字來定義類
- 使用var/val來定義成員變量
- 使用def來定義成員方法
- 使用new來創建一個實例對象
?
示例1:
定義一個Customer類,該類包含以下成員:
?
| 成員變量 |
| 姓名(例如:張三、李四) |
| 性別(例如:男、女) |
| 注冊時間(不可修改)(2010/03/12) |
?
| 成員方法 |
| sayHi(消息) |
?
定義好類之后,創建該類的對象。并給該對象賦值,并打印對象中的成員,調用成員方法。
?
步驟
定義一個Customer類,并添加成員變量/成員方法
添加一個main方法,并創建Customer類的對象,并給對象賦值,打印對象中的成員,調用成員方法
?
scala代碼:
class?Customer {var?name:String =?_var?sex:String =?_val?registerDate:Date =?new?Datedef?sayHi(msg:String)?=?{println(msg)}
}object?Main {def?main(args:?Array[String]):?Unit?=?{val?customer =?new?Customercustomer.name =?"張三"customer.sex =?"男"println(s"姓名: ${customer.name}, 性別:${customer.sex}, 注冊時間: ${customer.registerDate}")customer.sayHi("你好!")}
}
?
var name:String = _,_表示使用默認值進行初始化
- String類型默認值是null,Int類型默認值是0,Boolean類型默認值是false...
val變量不能使用_來進行初始化,因為val是不可變的,所以必須手動指定一個默認值
main方法必須要放在一個scala的object(單例對象)中才能執行
?
getter/setter - 了解
問題1:
上述的案例,創建出來一個Customer實例,就可以給name、sex這些字段進行賦值、并可以獲取它們的值。這是否意味著這些字段默認都是public的呢?
為了驗證上述問題,我們需要反編譯scala編譯出來的class文件,看一看最終編譯器出來的字節碼是什么樣的。
使用jd-gui工具反編譯Customer類
?
使用jd-gui反編譯Main類
?
問題2:
是否能夠生成類似于Java的getter/setter方法呢?
?
可以,在字段上加上@BeanProperty就可以了。
??@BeanProperty
??var?name:String =?_ ????????????// 姓名
??@BeanProperty
??val?registerDate =?new?Date()???// 注冊時間
?
?通過查看反編譯的代碼,scalac編譯器已經自動幫助我們添加了Java的getter/setter
scala會自動為成員變量生成scala語言的getter/setter
scala的getter為字段名(),setter為字段名_=()
要生成Java的getter/setter,可以在成員變量上加一個@BeanProperty注解,這樣將來去調用一些Java庫的時候很有用
?
類的構造器 - 掌握
?
- 主構造器
?類名(var/val?參數名:類型 =?默認值,?var/val?參數名:類型 =?默認值){
????// 構造代碼塊
}
- 輔助構造器
this來定義,例如:
?this(參數名:類型,?參數名:類型)?{
????...
}
示例1:定義主構造器
class?Student(_name:String,?_age:Int)?{var?name:String =?_var?age:Int?=?_// 構造器的代碼可以直接寫在類中name =?_nameage =?_age
}
?
示例2:簡化定義主構造器
// 在主構造器中,可以直接定義成員變量
class?Student(val?name:String,?val?age:Int)
?
示例3:定義輔助構造器
class?Student(val?name:String,?val?age:Int)?{// 定義一個參數的輔助構造器def?this(name:String)?{// 第一行必須調用主構造器、其他輔助構造器或者super父類的構造器this(name,?20)}def?this(age:Int)?{this("某某某",?age)}
}
?
主構造器直接在類名后面定義
主構造器中的參數列表會自動定義為私有的成員變量
一般在主構造器中直接使用val/var定義成員變量,這樣看起來會更簡潔
在輔助構造器中必須調用其他構造器(主構造器、其他輔助構造器)
總結
以上是生活随笔為你收集整理的2021年大数据常用语言Scala(二十八):scala面向对象 MAVEN依赖和类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年大数据常用语言Scala(二十
- 下一篇: 2021年大数据常用语言Scala(二十