//定义一个简单的类
scala> :paste
// Entering paste mode (ctrl-D to finish)
//类默认public的
class HelloWorld{
private var name = "leo"
def sayHello(){print("Hello,"+name)}
def getName = name
}
// Exiting paste mode, now interpreting.
defined class HelloWorld
scala> var helloWorld = new HelloWorld
helloWorld: HelloWorld = HelloWorld@74f143e1
scala> helloWorld.sayHello()
Hello,leo
scala> print(helloWorld.getName) //也可以不加括号,如果定义方法时不带括号,则用方法时也不能带括号
leo
//getter与setter
//定义不带private的var field,JVM会自动定义为private,并提供public的getter和setter方法
//如果定义private 修饰field,则生成getter和setter也是private的
//如果定义val filed,则只会生成getter方法
//如果不希望生成setter和getter方法,则将field声明为private[this]
自定义getter与setter
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Student{
private var myName = "leo"
def name = "your name is" + myName
def name_=(newValue:String){
print("you cannot edit your name!!")
}
}
// Exiting paste mode, now interpreting.
defined class Student
scala> val leo = new Student //()可有可无
leo: Student = Student@4064c13a
scala> print(leo.name)
your name isleo
scala> leo.name = "leo1" //相当于setter方法
you cannot edit your name!!leo.name: String = your name isleo
仅暴露field的getter方法
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Student{
private var myName = "leo" //private修饰,不暴露getter和setter方法,因此可以自定义
def updateName(newName:String){
if(newName == "leo1") myName = newName
else print("not accpet this new name!!")
}
def name = "your name is "+myName
}
// Exiting paste mode, now interpreting.
defined class Student
scala> val s = new Student()
s: Student = Student@6ff347a9
scala> s.name
res30: String = your name is leo
scala> s.updateName("tom")
not accpet this new name!!
scala> s.updateName("leo1")
scala> s.name
res33: String = your name is leo1
private[this]的使用
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Student{
private var myAge = 0
def age_=(newValue:Int){
if(newValue > 0) myAge = newValue
else print("illegal age!")
}
def age = myAge
def older(s:Student)={ //用private[this]修饰的话会报错
myAge > s.myAge
}
}
// Exiting paste mode, now interpreting.
defined class Student
scala> val s1 = new Student
s1: Student = Student@1c437904
scala> s1.age = 20
s1.age: Int = 20
scala> val s2 = new Student
s2: Student = Student@400f0e8e
scala> s2.age = 25
s2.age: Int = 25
scala> s1.older(s2)
res34: Boolean = false
java风格的getter和setter
// 在Scala 2.10.0之后已被废弃
// 使用scala.beans.BeanProperty代替
scala> import scala.beans.BeanProperty
import scala.beans.BeanProperty
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Student{
@BeanProperty var name:String = _
}
// Exiting paste mode, now interpreting.
defined class Student
scala> val s = new Student
s: Student = Student@1166c9c5
scala> s.setName("leo")
scala> s.get
getClass getName
scala> s.getName
res39: String = leo
辅助构造函数constructor
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Student{
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
}
}
// Exiting paste mode, now interpreting.
defined class Student
scala> var s1 = new Student()
s1: Student = Student@51c959a4
scala> val s2 = new Student("leo")
s2: Student = Student@51a18b21
scala> val s3 = new Student("leo",30)
s3: Student = Student@40ef0af8
主构造函数constructor
//主constructor与类名放在一起,与java不同
//类中没有定义在任何方法或者代码块中的代码,就是主constructor的代码
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Student(val name:String,val age:Int){
println("your name is "+name +",your age is "+age)
}
// Exiting paste mode, now interpreting.
defined class Student
scala> val s = new Student
<console>:12: error: not enough arguments for constructor Student: (name: String, age: Int)Student.
Unspecified value parameters name, age.
val s = new Student
^
scala> val s = new Student("jom",23)
your name is jom,your age is 23
s: Student = Student@2d70f312
//给默认值
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Student(val name:String="leo",val age:Int=30){ // 如果主constructor传入的参数什么修饰都没有,比如name:String ,那么如果类内部方法使用到了,则会声明为private[this] name;否则没有该field,就只能被constructor代码使用而已
println(name+" "+age)
}
// Exiting paste mode, now interpreting.
defined class Student
scala> val s1 = new Student
leo 30
s1: Student = Student@cf10c92
内部类
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Class{
class Student(val name:String){}
val students = new ArrayBuffer[Student]
def getStudent(name:String)={
new Student(name)
}
}
// Exiting paste mode, now interpreting.
defined class Class
scala> val c1 = new Class
c1: Class = Class@539bb233
scala> val s1 = c1.getStudent("leo")
s1: c1.Student = Class$Student@48b01607
scala> c1.students += s1
res0: c1.students.type = ArrayBuffer(Class$Student@48b01607)
scala> val c2 = new Class
c2: Class = Class@475fb7
scala> val s2 = c2.getStudent("leo")
s2: c2.Student = Class$Student@5f9f1886
scala> c1.students += s2
<console>:15: error: type mismatch;
found : c2.Student
required: c1.Student
c1.students += s2
^
scala> :paste
// Entering paste mode (ctrl-D to finish)
object Person{
private var eyeNum=2
println("this Person object!")
def getEyeNum = eyeNum
}
scala> Person.getEyeNum
this Person object!
res3: Int = 2
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Person(val name:String,val age:Int){
def sayHello = println("Hi,"+name+",I guess you are "+age+"years old!"+Person.eyeNum)
}
object Person{
private val eyeNum = 2
def getEyeNum = eyeNum
}
scala> val p = new Person("TOM",30)
p: Person = Person@101f2ca2
scala> p.sayHello
Hi,TOM,I guess you are 30years old!2
scala> :paste
// Entering paste mode (ctrl-D to finish)
abstract class Hello(val message:String){
def sayHello(name:String):Unit
}
object HelloImpl extends Hello("hello"){
override def sayHello(name:String)={
println(message+","+name)
}
}
scala> HelloImpl.sayHello("world")
hello,world
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Person(val name: String)
object Person{
def apply(name:String)=new Person(name)
}
// Exiting paste mode, now interpreting.
defined class Person
defined object Person
scala> val p1 = new Person("leo")
p1: Person = Person@7698b7a4
scala> val p2 = Person("leo")
p2: Person = Person@374c40ba
object HelloWorld{
def main(args:Array[String]){
println("Hello World!!")
}
}
object HelloWorld extends App{
if(args.length > 0) println("hello," + args(0))
else println("Hello World!!")
}
object Season extends Enumeration{
val SPRING,SUMMER,AUTUMN,WINTER = Value
}
scala> Season.SPRING
res0: Season.Value = SPRING
scala> :paste
// Entering paste mode (ctrl-D to finish)
object Season extends Enumeration{
val SPRING = Value(0,"spring")
val SUMMER = Value(1,"summer")
val AUTUMN = Value(2,"autumn")
val WINTER = Value(3,"winter")
}
// Exiting paste mode, now interpreting.
defined object Season
scala> Season(0)
res0: Season.Value = spring
scala> Season.withName("spring")
res1: Season.Value = spring
scala> for(ele <- Season.values) println(ele)
spring
summer
autumn
winter
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Person{
private var name = "leo"
def getName = name
}
class Student extends Person{
private var score = "A"
def getScore = score
}
// Exiting paste mode, now interpreting.
defined class Person
defined class Student
scala> val s1 = new Student()
s1: Student = Student@1530d0f2
scala> s1.getScore
res3: String = A
scala> s1.getName
res4: String = leo
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Person{
private var name="leo"
def getName = name
}
class Student extends Person{
private var score = "A"
def getScore = score
override def getName = "Hi,I'm "+ super.getName
}
// Exiting paste mode, now interpreting.
defined class Person
defined class Student
scala> val st = new Student
st: Student = Student@445c693
scala> st.getName
res5: String = Hi,I'm leo
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Person
class Student extends Person
val p:Person = new Student
var s:Student = null
if(p.isInstanceOf[Student]) s = p.asInstanceOf[Student]
// Exiting paste mode, now interpreting.
defined class Person
defined class Student
p: Person = Student@2d7e6c8c
s: Student = Student@2d7e6c8c
scala> s
res9: Student = Student@2d7e6c8c
scala> :paste
class Person
class Student extends Person
val p:Person = new Student
p.isInstanceOf[Person]
// Exiting paste mode, now interpreting.
defined class Person
defined class Student
p: Person = Student@5b95557f
res11: Boolean = true
scala> p.getClass == classOf[Person]
res12: Boolean = false
scala> p.getClass == classOf[Student]
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Person
class Student extends Person
val p:Person = new Student
p match{
case per:Person => println("its Person object")
case _ => println("unkonwn type")
}
// Exiting paste mode, now interpreting.
its Person object
defined class Person
defined class Student
p: Person = Student@7f4596d0
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Person{
protected var name:String="leo"
protected[this] var hobby:String = "game"
}
class Student extends Person{
def sayHello = println("Hello,"+name)
def makeFriends(s:Student){
println("my hobby is "+hobby + ",your hobby is " +s.hobby)
}
}
// Exiting paste mode, now interpreting.
<pastie>:20: error: value hobby is not a member of Student
println("my hobby is "+hobby + ",your hobby is " +s.hobby)
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Person(val name:String,val age:Int)
class Student(name:String,age:Int,var score:Double) extends Person(name,age){
def this(name:String){
this(name,0,0)
}
def this(age:Int){
this("leo",age,0)
}
}
// Exiting paste mode, now interpreting.
defined class Person
defined class Student
scala> :paste
// Entering paste mode (ctrl-D to finish)
class Person(protected val name:String){
def sayHello = "Hello,I'm " + name
}
val p = new Person("leo"){
override def sayHello = "Hi,I'm "+name
}
def greeting(p:Person{def sayHello:String}){
println(p.sayHello)
}
// Exiting paste mode, now interpreting.
defined class Person
p: Person = $anon$1@628b9af5
greeting: (p: Person{def sayHello: String})Unit
scala> p.sayHello
res5: String = Hi,I'm leo
scala> greeting(p)
Hi,I'm leo
scala> :paste
// Entering paste mode (ctrl-D to finish)
abstract class Person(val name:String){
def sayHello:Unit
}
class Student(name:String) extends Person(name){
def sayHello:Unit = println("Hello, "+name) //可以省略override
}
// Exiting paste mode, now interpreting.
defined class Person
defined class Student
scala> val s = new Student("jike")
s: Student = Student@49bcd90d
scala> s.sayHello
Hello, jike
abstract class Person{
val name :String
}
class Student extends Person{
val name :String = "leo"
}
scala> val s = new Student
s: Student = Student@48c2391
scala> s.name
res9: String = leo