文章地址:http://www.haha174.top/article/details/256593
1.定义一个简单的类
//定义类包含field 方法
class HelloClass {
private var name="leo";
def sayHello(){println("hello"+name)}
def getName()=name
}
//创建类的对象并调用其方法
var hello=new HelloClass
hello.sayHello()
println(hello.getName())
2.getter 和setter
1.定义不带private 的var field scala 会自动提供提供public 的set 和get 方法
2.定义带private 的set 和get 方法 scala 会自动生成set 和get 方法 也是private 的
3.如果定义 val field 只会生成 get 方法
4.如果不需要set 和get 方法 则可以将field 声明为private[this]
5.调用set 和get 方法分别石 name 和 name_
6.自定义set 和get
如果只需要简单的set 和get 可以根据scala 的语法选择合适的修饰符即可,
如果需要自定义set get ,自定义set 方法的时候一定要注意scala 的语法限制,签名·=,参数之间不能又空格。
7.java 风格的getter 和setter 方法
如果让scala 生成java 生成setter 和getter 方法,只要给 field 添加 @BeanProperty注解即可 此时会生成4个方法
name:String,name_=(newValue:String):Unit,getString():String,setName=(newValue:String):Unit。
@BeanProperty var age:Int=_;
3.constructor
在Scala中,可以给类定义多个辅助constructor 类似java 中的构造重载,
辅助constructor可以相互调用,而且必须第一行调用主constructor
def this(name:String){
this()
this.name=name
}
def this(name:String,age:Int){
this(name)
this.age=age
}
在scala 中主 constructor与类名放到一起的
class HelloClass
主 constructor可以通过类名设定参数和默认值
如果主主 constructor传入的参数什么修饰都没有,如name:String 如果类的内部用到了则会申明private[this] name;否则没有该field 只能被constructor代码使用
4.内部类
在scala 中同样也可以定义内部类,但是与java 不同的是,每个外部类的对象的内部类都是不同的类
/**
* 第一种方式
* 在内部类通过【外部类.this.成员名称】 访问外部类成员
*/
class OuterClass(val name:String){
class InnerClass(val name:String){
def info = println("Outer name :" + OuterClass.this.name + ",Inner Name :" + name);
}
}
/**
* 第二种方式
* 在内部类通过【外部类别名】 访问外部类成员
*/
class OuterClass2(val name:String){
outer =>
class InnerClass2(val name:String){
def info = println("Outer name :" + outer.name + ",Inner Name :" + name);
}
}
object OuterAndInnerClassTest {
def main(args: Array[String]): Unit = {
println("第一种访问方式:")
val outer1 = new OuterClass("yy")
val inner1 = new outer1.InnerClass("xx")
inner1.info
println("第二种访问方式:")
val outer2 = new OuterClass2("yy2")
val inner2 = new outer2.InnerClass2("xx2")
inner2.info
}
}