//不用修饰符 class HelloWorld{ //定义一个私有的field private var name = "CZM" def fun(){ //这是一个带参数的方法 } def getName = name //定义一个不带参数的方法
val helloWorld = new HelloWorld //括号无关紧要
//能够不写*()* helloWorld.fun() //不能写*()* helloWorld.getName
//自动生成的getter和setter方法,经过 val var private private[this] var name = "CZM" /*自动生成以下代码 //getter def name = name //setter def name_ = (new_name:String) */ //手动getter和setter private var name= "CZM" def name = "Your name is "+name //错误,由于这样至关于两次定义了name class HelloWorld { private var old_name= "CZM" def name = "Your name is "+old_name //正确:old_name 做为类中的私有feild,仅仅提供私有的getter和setter方法,而name做为一个提供了public的getter和setter方法的feild ==> var name并重写了public的getter和setter def name_=(new_name: String) { //须要注意的是这里的语法规则,**=号先后不容许有空格** old_name = new_name print("Your new name is " + old_name) } } //调用getter和setter var helloWorld = new HelloWorld() helloWorld.name //geter helloWorld.name_= "asd" //正儿八经setter helloWorld.name = "asd" //新型setter,将name做为返回,买一送一
class Student{ private var myAge = 0 //private[this] var myAge = 0 //调用getter方法会报错,即便定义了getter和setter方法 def age = myAge def age_=(newValue:Int){ if (newValue<0){println("illegal gar!!")} else{myAge = newValue} } def older(s:Student){ myAge > s.myAge } }
@BeanProperty var age = 0 @BeanProperty var age:Int = _ //使用占位符须要声明类型 //同时拥有两种调用方式 s1.getAge s1.age
//固然,能够设置默认参数 class Student(name:String,age:Int){}
class Student(){ private var name = "" private var age = 0 def this(name:String){ this() //若是不相互调用,必须调用**主构造函数**,且要在**首行 == JAVA** this.name = name } def this(name:String,age:Int){ this(name) this.age = age } }
与JAVA不一样的是,Scala中的外部类的对象的内部类都是不一样的类java
import scala.collection.mutable.ArrayBuffer class Class { class Student(name: String) {} val students = new ArrayBuffer[Student]() def getStudent(name: String) = { new Student(name) } } val c1 = new Class val c2 = new Class val s1 = c1.getStudent("CZM") //s1: c1.Student = Class$Student@1d3f8af1 val s2 = c2.getStudent("czm") //s2: c2.Student = Class$Student@73589106 c1.students += s1 //正确 c1.students += s2 //错误,每个内部类都是属于对象的,而不是独立存在的 /*错误信息 Error:(21, 24) type mismatch; found : c2.Student required: c1.Student c1.students += s2 */
因为类中定义的feild都是属于对象的,并无属于类的字段,在JAVA中使用Static定义的字段做为全部对象共用的类的字段,在scala中提供了object来存放。spring
//定义object对象 object Person { //不能有括号,不能定义带参数的constructor private var name = "" println("This is constructor!") def getName = name println("This is constructor too!") } Person.getName //让object继承抽象类 abstract class Hello { def syaHello(name: String): Unit } object HelloObject extends Hello { override def syaHello(name: String): Unit = { println("Implement from Hello, your name is " + name) } } HelloObject.syaHello("CZM")
class Person(name: String, age: Int) { def sayHello = { println("Hello " + name + " you are " + age + " years old, and you must have " + Person.legNum + "legs") //须要加上Object名访问object对象变量(即便不是私有的) } } object Person { private var legNum = 2 def getLegNum = legNum } val p1 = new Person("czm", 18) p1.sayHello
class Person(name: String) object Person { def apply(name: String): Person = new Person(name) } Person("你好")
//注意文件名与类名相同 object HelloWorld { def main(args: Array[String]) { if (args.length != 0) { println("Hello " + args(0)) } else { println("Hello World!") } } }
继承APP Trait,而后将须要在main中运行的代码,直接在constructor中编写。直接使用args接收传入的参数黑人问号脸??:这里的参数是来自父类APP Trait的父类DelayedInit Trait的Main方法中的args数组
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 //Value方法继承于Enumeration //能够自定义Value的元素 val SPRING = Value(0,"spring") ... } //调用 //Enumeration的apply方法返回一个Value对象 Season(0) res0: Season.Value = SPRING Season("spring")
enum Weeday{ SUNDAY,MONDAY.TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY; } //在底层 //建立了一个final的Weeday类继承Enum //实例化各个字段为 public final static 的 Weekday 对象,存在数组$VALUES中 //定义了一个values方法,用于返回数组 //Weekday.values() //定义了一个valueOf方法,用于返回 //Weekday.valueof("SUNDAY")