Scala类与对象

一、类

1、简单类与属性

类的定义可以通过class关键字实现,在Scala中,类并不声明为Public,一个Scala源文件可以包含多个类。所有这些类都具有公有可见性。调用无参方法时,可以加(),也可以不加 
JavaBeans规范定义了Java的属性是像getXXX()和setXXX()的方法。许多Java工具都依赖这个命名习惯。为了Java的互操作性。将Scala字段加@BeanProperty时,这样的方法会自动生成。

package com.soft863
import scala.beans.BeanProperty

class Dog {

  private var leg: Int = 4

  @BeanProperty var name: String = ""
  @BeanProperty  var age: Int = 3

  def shout(content: String): Unit = {
    println(content)
  }

  def shout1(content: String) {
    println(content)

  }

  def main(args: Array[String]): Unit = {
    //    var dog = new Dog
    var dog = new Dog()
    dog.shout("汪汪汪")
    dog.setName("博美")
    dog.setAge(5)
    println(dog.leg)
    println(dog.getName())
    println(dog.getAge())
  }

}

2、构造器

构造器分为主构造器和从构造器

2.1、主构造器

1. 与Java构造不同之处在与,Scala不需要定义与类名相同的方法作为构造器。
2. 主构造器的参数列表直接写在类名(Class)后面,构造器的内容定义在类的里面。
所以,一个Scala类中,除了变量,方法以外的代码都是主构造器的内容。

package com.soft863

object Person {
  def main(args: Array[String]): Unit = {
    var person = new Person("superjean",18)
  }
  
}

class Person(name:String ,age:Int) {

  println("名字:"+name)
  println("年龄"+age)

  def eat(thing:String): Unit ={
    println("吃"+thing)
  }
}

2.2、从构造器

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

package com.soft863

class Person1 (name:String,age:Int){
  println(name)
  println(age)
  var id = 1

  def this(name:String,age:Int,id:Int){
    this(name,age)
    this.id = id
    println("学号"+id)
  }
}

object Person1{

  def add(a:Int,b:Int):Int=a+b
  def main(args: Array[String]): Unit = {
    new Person1("wcj",18,2)
    var res = add(1,2)
    println(res)
  }
}

 二、对象

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中可以通过伴生对象进行实现。
类和它的伴生对象可以相互访问私有特性,他们必须存在同一个源文件中。必须同名

package com.soft863

class Cat {

  var hair:Int = Cat.growHair()
  var name = "加菲猫"

  def changeName(name:String):Unit={
    this.name = name
  }

  def describe(): Unit ={
    println("hair:"+hair+",name:"+name)
  }
}

object Cat{
  var hair = 0
  def growHair():Int= {
    hair+=1
    hair
  }

  def main(args: Array[String]): Unit = {
    var cat1 = new Cat
    var cat2 = new Cat

    cat1.changeName("黑猫")
    cat2.changeName("白猫")
    cat1.describe()
    cat2.describe()
  }
}

3、 Apply方法


1) apply方法一般都声明在伴生类对象中,可以用来实例化伴生类的对象
当遇到类名(参数1,...参数n)时apply方法会被调用,apply的作用主要是创建类的对象时,不需要通过new这个关键字:
也可以用来实现单例模式,我们只需要对上述列子稍加改进:

package com.soft863

class Man(name: String, sex: String) {
  def descibe(): Unit = {
    println(name + sex)
  }
}

object Man {
  def apply(name: String): Man = {
    new Man(name, "男")
  }

/*  //单例模式写法
 var instance :Man = null

  def apply(name: String): Man = {
    if(instance ==null){
      new Man(name, "男")
    }
    instance
  }*/
  
  def main(args: Array[String]): Unit = {
    var man1 = Man("superjean")
    var man2 = Man("wcj")
    //    man1.descibe
    man1.descibe()
    man2.descibe()
  }
}

4、 应用程序对象


每一个Scala应用程序都需要从一个对象的main方法开始执行,这个方法的类型为Array[String]=>Unit:

object Hello {
  def main(args: Array[String]) {
    println("Hello, World!")
  }
}


或者扩展一个App特质:

package com.soft863

object Hello  extends App{
  println("hello World")

  if (args.length > 0)
    println("Hello, " + args(0))
  else
    println("Hello, World!")
  
}

三、继承

在Scala中扩展类的方式和Java一样都是使用extends关键字,
同样的,scala也不支持多继承


1、重写方法


在Scala中重写一个非抽象的方法必须使用override修饰符

package com.soft863
class Animal{
  def run(): Unit ={
    println("我是动物,我会跑")
  }
}

class Wolf extends Animal {

  override def run(): Unit = {
    super.run()
    println("我是狼,我跑的很快")
  }

}
object Wolf{
  def main(args: Array[String]): Unit = {
    var wolf = new Wolf
    wolf.run()
  }
}


2、抽象类


和java一样,抽象类通过abstract修饰,功能也和java一样
方法不用标记abstract,只要省掉方法体即可

package com.soft863

abstract class Plant {
  def bloom(name: String): String
}

class Rose extends Plant {
  var color = "红色"

  override def bloom(name: String): String = {
    name + "绽放出" + color + "的花朵"
  }
}

object Rose extends App {
  val rose = new Rose
  var res = rose.bloom("玫瑰")
  println(res)
}


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数智侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值