scala知识点 First---------- 类、对象、

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)主构造器

  1. 与Java构造不同之处在与,Scala不需要定义与类名相同的方法作为构造器。
  2. 主构造器的参数列表直接写在类名(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)从构造器

  1. 以def this开始
  2. 从构造器相当于java的重载构造器
  3. 从构造器里的第一行必须调用主构造器或其他从构造器
  4. 只能调用在自己之前定义的其他从构造器,而不能调用后面定义的,以防止死循环调用
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方法

  1. 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

  1. 也可以用来实现单例模式,我们只需要对上述列子稍加改进:
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、

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值