1、面向?qū)ο蟮幕靖拍?/p>
把數(shù)據(jù)及對(duì)數(shù)據(jù)的操作方法放在一起,作為一個(gè)相互依存的整體——對(duì)象,面向
對(duì)象的三大特征:
-
?封裝
-
?繼承
-
?多態(tài)
2、類的定義
簡(jiǎn)單類和無(wú)參方法
class?Counter{
private var?value?=0;
def?increment() {?value+=1};
def?current() =value;
}
//注意:class?前面沒有public?關(guān)鍵字修飾
如果要開發(fā)main方法,需要將main方法定義在該類的伴生對(duì)象中,即:object對(duì)
象中,(后續(xù)做詳細(xì)的討論):
class?Counter{
private var?value?=0;
def?increment() {?value+=1};
def?current() =value;
}
//Scala?中類的定義
class?Student1{
//定義屬性
private var?stuName:String?=?"Tom"
private var?stuAge:Int?=20
//成員方法
def?getStuName():String?=?stuName
def?setStuName(newName:String) =this.stuName=newName
def?getStuAge():Int?=?stuAge
def?setStuAge(newAge:Int) =?this.stuAge=newAge
}
object?student {
def?main(args: Array[String]):?Unit?= {
//測(cè)試student1
var?s1 =?new?Student1
//第一次輸出
println(s1.getStuName() +?"\t"?+ s1.getStuAge())
//調(diào)用set方法
s1.setStuName("Mary")
s1.setStuAge(25)
//第二次輸出
println(s1.getStuName() +?"\t"?+ s1.getStuAge())
//第三次輸出
// println(s1.stuName + "\t" + s1.stuAge)
}
}
3、屬性的getter和setter方法
當(dāng)定義屬性是private時(shí)候,scala會(huì)自動(dòng)為其生成對(duì)應(yīng)的get和set方法,如下所
示:
private var stuName:String = "Tom"
get方法: stuName ----> s2.stuName() 由于stuName是方法的名字,所
以可以加上一個(gè)括號(hào)
set方法: stuName_= ----> stuName_= 是方法的名字
定義屬性:private var money:Int = 1000 希望money只有g(shù)et方法,沒有
set方法??
辦法:將其定義為常量private val money:Int = 1000
private[this]的用法:該屬性只屬于該對(duì)象私有,就不會(huì)生成對(duì)應(yīng)的set和
get方法。如果這樣,就不能直接調(diào)用,例如:s1.stuName ---> 錯(cuò)誤
//屬性的get?和?set?方法
/*
1.當(dāng)定義屬性是private?時(shí)候,scala會(huì)自動(dòng)為其生成對(duì)應(yīng)的get?和set方法
private var stuName:String = "Tom"
(1) get?方法:stuName ----> s2.stuName()
(2) set?方法:stuName_=
2.定義屬性:private var money:Int = 1000?希望money只有g(shù)et方法,沒有set方法?
方法:將其定義為常量private val money:Int = 1000
3.private[this]
3.private[this]的方法:該屬性只屬于該對(duì)象私有,就不會(huì)生成對(duì)應(yīng)的set和get方法
*/
class?Student2 {
//定義屬性
private?var?stuName:String?=?"Tom"
//private [this] var stuAge:Int =20
private?var?stuAge:Int?=?20
private val?money:Int?=?1000
}
//測(cè)試
object?Student2 {
def?main(args: Array[String]):?Unit?= {
var?s2 =?new?Student2
println(s2.stuName?+?"\t"?+ s2.stuAge)
println(s2.stuName?+?"\t"?+s2.stuAge?+?"\t"?+ s2.money)
//修改money的值?--》?error
//s2.money = 2000
}
}
4、內(nèi)部類(嵌套類)
我們可以在一個(gè)類的內(nèi)部在定義一個(gè)類,如下:我們?cè)赟tudent類中,再定義了
一個(gè)Course類用于保存學(xué)生選修的課程:
import?scala.collection.mutable.ArrayBuffer
//嵌套類:內(nèi)部類
class?Student3 {
//定義一個(gè)內(nèi)部類:記錄學(xué)生選修的課程信息
class?Course(val?courseName:String,val?credit:Int){
//定義其他方法
}
private?var?stuName:String?=?"Tom"
private?var?stuAge:Int?=?20
//定義一個(gè)ArrayBuffer記錄學(xué)生選修的所有課程
private var?courseList?=?new?ArrayBuffer[Course]()
//定義方法往學(xué)生信息中添加新的課程
def?addNameCourse(cname:String,credit:Int):?Unit?={
//創(chuàng)建新的課程
var?c =?new?Course(cname,credit)
//將課程加入list
courseList?+= c
}
}
//測(cè)試
object?Student3 {
def?main(args: Array[String]):?Unit?= {
//創(chuàng)建學(xué)生對(duì)象
var?s3 =?new?Student3
//給該學(xué)生添加新的課程
s3.addNameCourse("Chinese",2)
s3.addNameCourse("English",3)
s3.addNameCourse("Math",4)
//輸出
println(s3.stuName?+?"\t"?+ s3.stuAge)
println("*********選修課程***********")
for?(s <-s3.courseList)?println(s.courseName +?"\t"?+ s.credit)
}
}
5、類的構(gòu)造器
類的構(gòu)造器分為:主構(gòu)造器、輔助構(gòu)造器
主構(gòu)造器:和類的聲明結(jié)合在一起,只能有一個(gè)主構(gòu)造器
Student4(val stuName:String,val stuAge:Int)
(1) 定義類的主構(gòu)造器:兩個(gè)參數(shù)
(2) 聲明了兩個(gè)屬性:stuName和stuAge 和對(duì)應(yīng)的get和set方法
輔助構(gòu)造器:可以有多個(gè)輔助構(gòu)造器,通過關(guān)鍵字this來(lái)實(shí)現(xiàn)
/*
類的構(gòu)造器
1.主構(gòu)造器:和類的聲明結(jié)合在一起;只能有一個(gè)主構(gòu)造器
Student4(val stuName:String,var stuAge:Int)
(1)定義類的主構(gòu)造器:兩個(gè)參數(shù)
(2)聲明了兩個(gè)屬性:stuName和stuAge?和 對(duì)應(yīng)的get?和?set?方法
2.輔助構(gòu)造器:可以有多個(gè)輔助構(gòu)造器
通過關(guān)鍵字this?來(lái)實(shí)現(xiàn)
*/
class?Student4 (val?stuName:String,val?stuAge:Int) {
//定義輔助構(gòu)造器
def this(age:Int){
//調(diào)用主構(gòu)造器
this("no name",age)
}
}
object?Student4 {
def?main(args: Array[String]):?Unit?= {
//創(chuàng)建Student4的一個(gè)對(duì)象
var?s4 =?new?Student4("Tom",20)
println(s4.stuName +?"\t"?+s4.stuAge)
//創(chuàng)建一個(gè)新的Student4?的對(duì)象
var?s42 =?new?Student4(25)
println(s42.stuName +?"\t"?+ s42.stuAge)
}
}
6、Scala中的Object對(duì)象
Scala沒有靜態(tài)的修飾符,但Object對(duì)象下的成員都是靜態(tài)的 ,若有同名的
class,這其作為它的伴生類。在Object中一般可以為伴生類做一些初始化等操
作。下面是Java中的靜態(tài)塊的例子。在這個(gè)例子中,我們對(duì)JDBC進(jìn)行了初始化:
而Scala中的Object就相當(dāng)于Java中靜態(tài)塊。
在 Scala 中,是沒有 static 這個(gè)東西的,但是它也為我們提供了單例模式的
實(shí)現(xiàn)方法,那就是使用關(guān)鍵字 object。
Scala 中使用單例模式時(shí),除了定義的類之外,還要定義一個(gè)同名的 object 對(duì)
象,它和類的區(qū)別是,object對(duì)象不能帶參數(shù)。
當(dāng)單例對(duì)象與某個(gè)類共享同一個(gè)名稱時(shí),他被稱作是這個(gè)類的伴生對(duì)象:
companion object。你必須在同一個(gè)源文件里定義類和它的伴生對(duì)象。類被稱為
是這個(gè)單例對(duì)象的伴生類:companion class。類和它的伴生對(duì)象可以互相訪問
其私有成員。
Object對(duì)象的應(yīng)用
單例對(duì)象文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-694522.html
//利用object?對(duì)象實(shí)現(xiàn)單例模式
object?CreditCard {
//變量保存信用卡號(hào),這里比較好的做法,是定義成private[this],即:該屬性只屬于該對(duì)象,這個(gè)方法由于定義在object中,所以是靜態(tài)的,即:?jiǎn)卫?
private[this]?var?creditCardNumber:Long?=?0
//產(chǎn)生新的卡號(hào)
def?generateNewCCNumber():Long?= {
creditCardNumber?+=?1
creditCardNumber
}
//測(cè)試程序
def?main(args: Array[String]):?Unit?= {
//產(chǎn)生新的卡號(hào)
println(CreditCard.generateNewCCNumber())
println(CreditCard.generateNewCCNumber())
println(CreditCard.generateNewCCNumber())
println(CreditCard.generateNewCCNumber())
}
}
使用應(yīng)用程序?qū)ο螅嚎梢允÷詍ain方法;需要從父類App繼承。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-694522.html
//使用應(yīng)用程序?qū)ο螅梢允÷詍ain方法
object?HelloWorld?extends?App{
/*
def main(args: Array[String]): Unit = {
//這里的main就可以不寫。相當(dāng)于下面的代碼是在main方法中執(zhí)行的。
}
*/
println("Hello World")
///如何取得命令行的參數(shù)
if(args.length >?0) {
println(args(0))
}else{
println("no arguents")
}
}
到了這里,關(guān)于2023_Spark_實(shí)驗(yàn)五:Scala面向?qū)ο蟛糠盅菔荆ㄒ唬↖DEA開發(fā))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!