定义一个简单的类:
package com.doit.scc
// 定义类,包含field以及方法
class HelloWorld {
private var name = "leo"
def sayHello(){print("Hello" + name)}
def getName = name
}
/*
函数:类外边定义的def
方法:类内定义的def
注意:如果定义的def后的方法名没加(),在调用的时候就不能加();
定义def的方法名加了()调用时,可以加()也可以不加()
*/
package com.doit.scc
object text {
def main(args:Array[String]):Unit = {
val helloworld = new HelloWorld
helloworld.sayHello() //Helloleo
print(helloworld.getName) //leo
}
}
自定义getter与setter
package com.doit.scc
// 自定义getter与setter
class GaS {
// 如果只是希望拥有简单的getter和setter方法,那么就按照scala提供的语法规则,根据需求为field选择合适的修饰符就好:var、val、private、private[this]
// 但是如果希望能够自己对getter与setter进行控制,则可以自定义getter与setter方法
// 自定义setter方法的时候一定要注意scala的语法限制,签名、=、参数间不能有空格
private var myName = "leo"
def name = "your name is " + myName //getter
def name_= (newValue:String){ //注意:name_与=之间没有空格 setter
println("you cannot edit your name!!!")
}
}
测试:
object text {
def main(args:Array[String]):Unit = {
val leo = new GaS
println(leo.name) //your name is leo
leo.name="leo1" //you cannot edit your name!!!
}
}
private
package com.doit.scc
class p_this {
// 如果将field使用private来修饰,那么代表这个field是类私有的,在类的方法中,可以直接访问类的其他对象的private field
private var myAge = 0
def age_=(newValue: Int) {
if (newValue > 0) myAge = newValue
else print("illegal age!")
}
def age = myAge
def older(s: p_this) = {
if(myAge > s.myAge) print("older")
}
}
测试:val pt = new p_this
pt.age= 19
val pp = new p_this
pp.age= 11
pt.older(pp)
运行结果:older
测试:val pt = new p_this
pt.age= -8
val pp = new p_this
pp.age= 11
pt.older(pp)
运行结果:illegal age!
private[this]
class p_this {
// 这种情况下,如果不希望field被其他对象访问到,那么可以使用private[this],意味着对象私有的field,只有本对象内可以访问到
private[this] var myAge = 0
def age_=(newValue: Int) {
if (newValue > 0) myAge = newValue
else print("illegal age!")
}
def age = myAge
def older(s: p_this) = {
if(myAge > s.myAge) print("older")
}
}
测试:val pt = new p_this
pt.age= 19
val pp = new p_this
pp.age= 11
pt.older(pp)
会报错:Error:(12, 18) value myAge is not a member of com.doit.scc.p_this
if(myAge > s.myAge) print("older")
这是因为在older方法中,调用了pp.myage,但是,之前定义个字段是private[this],只有当前类可用
Java风格的getter和setter方法
Scala的getter和setter方法的命名与java是不同的,是field和field_=的方式
如果要让scala自动生成java风格的getter和setter方法,只要给field添加@BeanProperty注解即可
此时会生成4个方法,name: String、name_=(newValue: String): Unit、getName(): String、setName(newValue: String): Unit
package com.doit.scc;
import scala.beans.BeanProperty;
class GaS_2{
@BeanProperty var name: String = _
}
测试:val s = new GaS_2
s.setName("ynn")
print(s.getName())
运行结果:ynn
//或者也可以在构造函数处加这个注解
package com.doit.scc;
import scala.beans.BeanProperty;
class GaS_2(@BeanProperty var name: String){
}
测试:val s = new GaS_2("ynn")
print(s.getName())
运行结果:ynn
辅助constructor
package com.doit.scc
class constructor {
// Scala中,可以给类定义多个辅助constructor,类似于java中的构造函数重载
// 辅助constructor之间可以互相调用,而且必须第一行调用主constructor
private var name = "lingling"
private var age = 0
def this(name:String){
this()
this.name = name
println("your name is " + name)
}
def this(name:String,age:Int){
this(name)
this.age = age
println("you are " + age + " years old")
}
}
测试:val c1 = new constructor("ning") //运行结果:your name is ning
val c2 = new constructor("ning",20) //运行结果:your name is ning you are 20 years old
主constructor
Scala中,主constructor是与类名放在一起的,与java不同,而且类中,没有定义在任何方法或者是代码块之中的代码,就是主constructor的代码,这点感觉没有java那么清晰
package com.doit.scc
class constructor_2(val name:String,val age:Int) { //主constructor
println("your name is " + name,"you are " + age + " years old")
}
测试: val s = new constructor_2("ning",20)
运行结果:(your name is ning,you are 20 years old)
// 主constructor中还可以通过使用默认参数,来给参数默认的值
package com.doit.scc
class constructor_2(val name:String = "ning",val age:Int=20) {
println("your name is " + name,"you are " + age + " years old")
}
测试: val s = new constructor_2()
运行结果:(your name is ning,you are 20 years old)
// 如果主constrcutor传入的参数什么修饰都没有,比如name: String,那么如果类内部的方法使用到了,则会声明为private[this] name;否则没有该field,就只能被constructor代码使用而已。
内部类
package com.doit.scc
import scala.collection.mutable.ArrayBuffer
class Class {
class Student(val name:String){}
val student = new ArrayBuffer[Student]
def getStudent(name:String)={
new Student(name)
}
}