类
1、在Scala中,类并不声明为Public,一个Scala源文件可以包含多个类。所有这些类都具有公有可见性。
调用无参方法时,可以加(),也可以不加
例如:
val dog = new Dog
2、avaBeans规范定义了Java的属性是像getXXX()和setXXX()的方法。许多Java工具都依赖这个命名习惯。
为了Java的互操作性。将Scala字段加@BeanProperty时,这样的方法会自动生成。
创建一个Bean,使用@BeanProperty注解标识某个属性变量
import scala.beans.BeanProperty
class Person {
@BeanProperty var name: String
}
通过getName、setName访问属性
val person = new Person
person.setName("Nick")
person.getName
println(person.name)
3、构造器
构造器分为主构造器和从构造器
1)主构造器
- 与Java构造不同之处在与,Scala不需要定义与类名相同的方法作为构造器。
- 主构造器的参数列表直接写在类名(Class)后面,构造器的内容定义在类的里面。
所以,一个Scala类中,除了变量,方法以外的代码都是主构造器的内容。
class Person(name: String, age: Int) {
println("我的名字是" + name)
println("我的年龄是" + age)
val id = 1001
def eat(thing: String): Unit = {
println("我要吃" + thing)
}
}
def main(args: Array[String]): Unit = {
new Person("xiaoming", 20)
}
2)从构造器
- 以def this开始
- 从构造器相当于java的重载构造器
- 从构造器里的第一行必须调用主构造器或其他从构造器
- 只能调用在自己之前定义的其他从构造器,而不能调用后面定义的,以防止死循环调用
class Person(name: String, age: Int) {
println("我的名字是" + name)
println("我的年龄是" + age)
var id = 1001
def this(name: String, age: Int, id: Int) {
this(name, age)
this.id = id
println("我的学号是" + id)
}
}
def main(args: Array[String]): Unit = {
new Person("xiaoli", 22, 1002)
}
输出为:
我的名字是xiaoli
我的年龄是22
我的学号是1002
对象
1、单例对象
在Scala中没有静态方法和静态字段,但是可以使用object这个语法结构来达到同样的目的
object Operation {
def add(a: Int, b: Int): Int = a + b
}
//直接在通过类名调用:
def main(args: Array[String]): Unit = {
Operation.add(1, 2)
}
2、 伴生对象
Java中的类可以既有实例方法又有静态方法,Scala中可以通过伴生对象进行实现。如下:
class Cat {
val hair = Cat.growHair
private var name = ""
def changeName(name: String) = {
this.name = name
}
def describe = println("hair:" + hair + ", name:" + name)
}
object Cat {
private var hair = 0
private def growHair = {
hair += 1
hair
}
}
测试:
// 创建两个Cat对象,而 Object Cat 因为是静态的,所以在内存中只有一份
// 在初始化 hair时,都调用了 Cat.growHair,所以 hair的值最终为2
val cat1 = new Cat
val cat2 = new Cat
cat1.changeName("黑猫")
cat2.changeName("白猫")
cat1.describe
cat2.describe
提示:类和它的伴生对象可以相互访问私有特性,他们必须存在同一个源文件中。必须同名
3、 Apply方法
- apply方法一般都声明在伴生类对象中,可以用来实例化伴生类的对象
当遇到类名(参数1,…参数n)时apply方法会被调用,apply的作用主要是创建类的对象时,不需要通过new这个关键字:
class Man(val sex: String, name: String) {
def describe(): Unit = {
println("Sex:" + sex + ",name:" + name)
}
}
object Man {
def apply(name: String): Man = {
new Man("男", name)
}
}
测试:
val man1 = Man("Nick")
val man2 = Man("Thomas")
man1.describe
man2.describe
结果为:
Sex:男,name:Nick
Sex:男,name:Thomas
- 也可以用来实现单例模式,我们只需要对上述列子稍加改进:
class Man(val sex: String, name: String) {
def describe(): Unit = {
println("Sex:" + sex + ",name:" + name)
}
}
object Man {
var instance: Man = null
def apply(name: String): Man = {
if (instance == null) {
instance = new Man("男", name)
}
instance
}
}
测试:
val man1 = Man("Nick")
val man2 = Man("Thomas")
man1.describe
man2.describe
结果为:
Sex:男,name: Nick
Sex:男,name: Nick
4、应用程序对象
每一个Scala应用程序都需要从一个对象的main方法开始执行,这个方法的类型为Array[String]=>Unit:
object Hello {
def main(args: Array[String]) {
println("Hello, World!")
}
}
或者扩展一个App特质:
object Hello extends App {
if (args.length > 0)
println("Hello, " + args(0))
else
println("Hello, World!")
}
5、