[TOC]
為企業(yè)提供成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、網(wǎng)站優(yōu)化、成都全網(wǎng)營(yíng)銷推廣、競(jìng)價(jià)托管、品牌運(yùn)營(yíng)等營(yíng)銷獲客服務(wù)。成都創(chuàng)新互聯(lián)公司擁有網(wǎng)絡(luò)營(yíng)銷運(yùn)營(yíng)團(tuán)隊(duì),以豐富的互聯(lián)網(wǎng)營(yíng)銷經(jīng)驗(yàn)助力企業(yè)精準(zhǔn)獲客,真正落地解決中小企業(yè)營(yíng)銷獲客難題,做到“讓獲客更簡(jiǎn)單”。自創(chuàng)立至今,成功用技術(shù)實(shí)力解決了企業(yè)“網(wǎng)站建設(shè)、網(wǎng)絡(luò)品牌塑造、網(wǎng)絡(luò)營(yíng)銷”三大難題,同時(shí)降低了營(yíng)銷成本,提高了有效客戶轉(zhuǎn)化率,獲得了眾多企業(yè)客戶的高度認(rèn)可!
需要說(shuō)明的是,官方給出的參考資料對(duì)于這方面講解得十分詳細(xì),目前入門來(lái)說(shuō),不需要達(dá)到這樣的理解,只需要可以進(jìn)行開發(fā)即可,這一部分我給出的是官方的一些文檔說(shuō)明,但是后面的定制和注解,就直接簡(jiǎn)單說(shuō)明能用就好了。
class PersonOps {
private var age = 0 //你必須初始化一個(gè)字段
def increment() {age += 1} //方法默認(rèn)是公有的
def currentAge() = age
}
1)在Scala中,類并不聲明為public。Scala源文件可以包含多個(gè)類,所有這些類都具有公有可見(jiàn)性。
2)如何進(jìn)行調(diào)用?
object MainOps{
def main(args: Array[String]) {
val personOps = new PersonOps
personOps.increment()
println("currentAge=> " + personOps.currentAge())
}
}
3)不能用類直接調(diào)用age,因?yàn)閍ge是私有字段,只能在PersonOps中訪問(wèn)到。
4)無(wú)參方法
println("currentAge=>" + personOps.currentAge())
println("currentAge=>" + personOps.currentAge)
建議:對(duì)設(shè)置值的時(shí)候,即改變對(duì)象狀態(tài)值或者狀態(tài)時(shí)使用(),而對(duì)于取值來(lái)說(shuō)(不會(huì)改變對(duì)象的狀態(tài)和值)去掉()是個(gè)不錯(cuò)的風(fēng)格,這也是我們事例中的方法。
personOps.increment()
println("currentAge=> " + personOps.currentAge)
5)你可以通過(guò)以不帶()的方式聲明currentAge來(lái)強(qiáng)制這種風(fēng)格:
class PersonOps {
private var age = 0 //你必須初始化一個(gè)字段
def increment() {age += 1} //方法默認(rèn)是公有的
def currentAge = age
}
結(jié)果:這樣一來(lái)在調(diào)用時(shí),必須要用不帶()的進(jìn)行方法調(diào)用
println("currentAge=>" + personOps.currentAge)
6)帶getter和setter的屬性
Java中屬性定義
public class PersonAge{ //這是Java
private int age;
public int getAge() { return age; }
public void setAge(int age) { this.age=age; }
}
getter和setter方式比共有字段(public)好在什么地方呢?
之所以說(shuō)getter和setter方法比公有字段更好,是因?yàn)樗鼈冏屇憧梢詮暮?jiǎn)單的get/set機(jī)制出發(fā),并在需要的時(shí)候做改進(jìn)。
5)scala中的getter和setter方法
class PersonA{
var age = 0
}
a.Scala生成面向JVM的類,其中有一個(gè)私有的age字段以及相應(yīng)的getter方法和setter方法。這兩個(gè)方法是公有的,因?yàn)槲覀儧](méi)有將age聲明為private。而對(duì)私有字段而言,getter和setter方法也是私有的。
a.在Scala中,getter和setter分別叫做age和age_=例如:
val personA = new PersonA
println("startAge=> " + personA.age)
personA.age = 21
println("endAge=> " + personA.age)
執(zhí)行下面的命令:
Scalac PersonOps.scala
\src\main\scala\tw\tw>javap -p PersonA.class
Compiled from "PersonOps.scala"
然后會(huì)生成下面的內(nèi)容:
public class tw.PersonA {
private int age;
public int age();
public void age_$eq(int);
public tw.PersonA();
}
正如你看到的那樣,編譯器創(chuàng)建了age
和age_$eq
,是因?yàn)镴VM不允許在方法名中出現(xiàn)=
說(shuō)明:在Scala中,getter和setter方法并非被命名為getXxx和setXxx,不過(guò)它們的用意是相同的。后面會(huì)介紹如何生成Java風(fēng)格的getXxx和setXxx方法,以使得你的Scala類可以與Java工具實(shí)現(xiàn)互操作
這部分先不用搞太復(fù)雜,直接使用Java版本的getter/setter方法即可,如下面一個(gè)類:
class Student {
private var age:Int = 0
def setAge(age:Int): Unit = {
this.age = age
}
def getAge() = age
}
測(cè)試如下:
scala> val s = new Student()
s: Student = Student@1608bb5d
scala> s
res200: Student = Student@1608bb5d
scala> s.getAge()
res201: Int = 0
scala> s.getAge
res202: Int = 0
scala> s.setAge(18)
scala> s.getAge
res204: Int = 18
官方關(guān)于getter/setter的知識(shí)內(nèi)容非常多,入門的時(shí)候這些案例可以先不用管,先從Java的角度出來(lái)能夠使用scala進(jìn)行開發(fā)即可。
如果對(duì)屬性使用了@BeanProperty
注解,那么就會(huì)自動(dòng)生成getter/setter方法,但是需要注意的是,其并沒(méi)有隱藏原來(lái)的屬性,也就是說(shuō)原來(lái)的屬性還是可以直接訪問(wèn)的,并且其不可以使用private進(jìn)行修飾。
看下面一個(gè)例子:
import scala.beans.BeanProperty
class Student {
@BeanProperty var age:Int = 0
}
測(cè)試如下:
scala> var s = new Student
s: Student = Student@46482990
scala> s.getAge()
res205: Int = 0
scala> s.setAge(18)
scala> s.getAge()
res207: Int = 18
scala> s.age
res208: Int = 18
上面啰嗦了很多,其實(shí)直接用下面的代碼來(lái)進(jìn)行說(shuō)明就OK了:
/**
* scala面向?qū)ο蟮谝徽? * 關(guān)于對(duì)象的構(gòu)造
* 類的構(gòu)造(和java一樣)
*
* 要運(yùn)行一個(gè)scala的程序,不能在class來(lái)執(zhí)行,需要在object中執(zhí)行
* 你可以將這個(gè)object中的所有的字段、成員,都作為java中的靜態(tài)的成員對(duì)待
*
* 在創(chuàng)建scala函數(shù)的時(shí)候,如果函數(shù)空參,我們可以在創(chuàng)建的時(shí)候省略掉這個(gè)(),但是在訪問(wèn)的時(shí)候也就不能使用帶()的方式
* 反之我們既可以使用帶(),也可以使用不帶()的方式進(jìn)行調(diào)用
* ab.foreach(println)
*
* 為什么我們要在javabean對(duì)字段創(chuàng)建對(duì)應(yīng)的getter和setter
* 帶getter和setter的屬性
* 就是為了程序的安全性?
* 屏蔽一些不合法的操作,提高程序的健壯性
*/
object _01ClazzFieldsOps {
def main(args: Array[String]): Unit = {
val person:Person = new Person()
person.increment()
println(person.currentAge())
println(person.currentAge)
val stu = new Student
// stu.age = -1
stu.setAge(-4)
stu.getName
val e = new Employee
}
}
class Person {
private var age:Int = 0 //創(chuàng)建一個(gè)類型為Int的私有化成員
def increment(): Unit = {
age += 1
}
def currentAge() = age
}
class Student {
private var age:Int = 15
private var name:String = "劉向前"
def setAge(a:Int):Unit = {
if(a < 1) {
throw new RuntimeException(s"你們家的孩子才是($a)歲呢")
}
age = a
}
def getAge = age
def getName = name
}
class Employee {
@BeanProperty var age:Int = 5
}
關(guān)于構(gòu)造器的說(shuō)明和使用,直接看下面的測(cè)試代碼就可以了,非常簡(jiǎn)潔:
package cn.xpleaf.bigdata.p2.constructor
/**
* scala中的類的構(gòu)造器說(shuō)明
* scala類的構(gòu)造器分為主構(gòu)造器和輔助構(gòu)造器
* 其構(gòu)造方式不同于java中的構(gòu)造方式,public 類名(參數(shù)列表){},在scala中的構(gòu)造器如何定義?
* scala中把類名后面的一對(duì){}括起來(lái)的內(nèi)容稱為主構(gòu)造器的函數(shù)體,默認(rèn)的主構(gòu)造器為空參構(gòu)造器,
* 如何定義一個(gè)有參的主構(gòu)造器呢?
* 就在類名后面寫上函數(shù)的定義即可
*
* 當(dāng)主構(gòu)造器滿足不了我們的需求之后,我們就可以創(chuàng)建更多的輔助構(gòu)造器來(lái)配合我們的業(yè)務(wù),輔助構(gòu)造器如何創(chuàng)建?
* def this // 輔助構(gòu)造器的函數(shù)名是this
* 注意,在輔助構(gòu)造中的第一句話,必須是調(diào)用該類的主構(gòu)造器或者其他輔助構(gòu)造器,this(參數(shù))
*
* 在一個(gè)類中只能有一個(gè)主構(gòu)造器,可以有若干輔助構(gòu)造器,在輔助構(gòu)造器的第一句話,調(diào)用this
*
*/
object _02ConstructorOps {
def main(args: Array[String]): Unit = {
val p = new Person
// p.show()
println("=================================")
val stu = new Student("前向劉", 17)
stu.show()
println("=================================")
val s = new Student
println("=================================")
val s1 = new Student(true)
}
}
class Person {
private var name:String = "劉向前"
private var age:Int = 18
/* def Person(n:String, a:Int): Unit = {
name = n
age = a
println("這是scala中的構(gòu)造器嗎?")
}
def Person(): Unit = {
println("這是scala中的構(gòu)造器嗎?")
}*/
println("這是scala中的構(gòu)造器嗎?")
def show() = println(s"name is $name and age is $age")
}
class Student(var name:String, var age:Int) {
def this() {
this("劉銀鵬", 25)
println("this is 輔助構(gòu)造器")
}
private var married:Boolean = false
def this(isMarried:Boolean) {
this()
married = isMarried
println(s"this($isMarried) 是另外一個(gè)構(gòu)造器")
}
println("這是scala中的構(gòu)造器嗎?")
def show() = println(s"name is $name and age is $age")
// show() // 類構(gòu)造時(shí)就會(huì)執(zhí)行該方法,屬性name和age也是默認(rèn)有的,因?yàn)樵谥鳂?gòu)造器中有
}
直接看下面的一個(gè)完整案例:
package cn.xpleaf.bigdata.p2.inner
/**
* 事物的內(nèi)部還包含著事物,被包含的事物不能使用非常簡(jiǎn)單的成員變量來(lái)描述,只能使用更為復(fù)雜的結(jié)構(gòu)去描述,
* 這個(gè)時(shí)候就用我們的內(nèi)部類去定義
*
* 當(dāng)多個(gè)變量重名的時(shí)候,遵循一個(gè)原則:局部?jī)?yōu)先
public class InnerClassOps {
public static void main(String[] args) {
Outer.Inner i = new Outer().new Inner();
i.show();
}
}
class Outer {
private int x = 5;
class Inner {
private int x = 6;
public void show() {
int x = 7;
System.out.println("Inner show: " + x);
}
}
}
this關(guān)鍵字,是本類的引用,當(dāng)前類的實(shí)例的引用
外部類的引用使用外部類名.this
scala同樣提供了一種較為簡(jiǎn)潔的寫法,就是在我們的最外層大括號(hào)里寫一個(gè)引用名稱outer =>
在內(nèi)部類中需要調(diào)用外部類的成員的時(shí)候,直接使用outer.成員代替外部類名.this
*/
object _03InnerClassOps {
def main(args: Array[String]): Unit = {
val outer = new Outer
val inner = new outer.Inner
inner.show()
}
}
class Outer { o =>
private val x = 5
class Inner { i =>
private var x = 6
def show(): Unit = {
val x = 7
println("Inner show: " + this.x) // 6
println("Inner show: " + i.x) // 6
println("Inner show: " + Outer.this.x) // 5
println("Inner show: " + o.x) // 5
}
}
}
當(dāng)前文章:Scala筆記整理(三):Scala面向?qū)ο蟆愒斀?
當(dāng)前網(wǎng)址:http://chinadenli.net/article8/jgihip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、企業(yè)建站、營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司、小程序開發(fā)、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)