Scala学习笔记--第7章 类(二)

7.4 类构造器与内部类

7.4.1 类构造器

和Java一样,Scala也支持多个构造器的定义,不过最重要的是主构造器,每个类都必须要有主构造器,主构造器不以this方法定义,而是与类定义交织在一起。

Java构造器示例:

public class Teacher {
    private String name;
    private int age;
    public Teader(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getAge() {
        return age;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setName() {
        return name;
    } 
}

Scala构造器示例:

import scala.beans.BeanProperty

object TeacherTest {
  def main(args : Array[String]) : Unit = {
    var t = new Teacher("李老师", 25)
    println("老师姓名:" + t.name + " 年龄:" + t.age)
    println("老师姓名:" + t.getName() + " 年龄:" + t.getAge())
  }
  
  class Teacher(@BeanProperty var name: String, @BeanProperty var age: Int) {
    println(“执行构造器里面的代码!”)
  }
}

从示例中可以看到,Scala的代码是相对Java来说极其精简,在Scala中的主构造器中,参数可以直接放在类名之后,并被编译成字段,其值则在构造时初始化为传入的参数,如果构造器中没有参数,例如 class Teacher { //… 省略字段的定义 },那么该类则拥有一个无参的主构造器,相当于Java里面的无参构造函数。

在主构造器中的参数,也可以加入修饰符private或者private[this],表示该参数只允许在类里面调用,就更之前学习的属性定义是一个意思。

 

主构造器参数

生成的字段/方法

name:String

对象私有字段。如果没有方法使用name,则没有该字段

private val/var name:String

私有字段,私有的get/set方法

varl/var name:String

私有字段,公有的get/set方法

@BeanProperty val/var name:String

私有字段,公有的Scala版和JavaBeans版的get/set方法

从Java开发转到Scala开发,对主构造器的语法可能有些难以理解,但在实际运用中,也可以不定义主构造器,但是得提供一个或多个辅助构造器,什么是辅助构造器?在Scala中,辅助构造器的名称为this,每一个辅助构造器都必须以一个对先前已定义的其他辅助构造器或主构造器的调用开始,还是拿刚才的Teacher类为例:

  class Teacher {
    private var name = ""
    private var age = 0
    
    def this(name:String) { // 辅助构造器1
      this() // 如果在这里不调用主构造器,则编译会出错
      this.name = name
    }
    
    def this(name:String, age:Int) { // 辅助构造器2 
      // 可以用this()或者this(name),前提是必须调用一个已定义好的主构造器或者辅助构造器
      this(name)
      this.age = age;
    }
  }

辅助构造器,其实就是相当于Java中构造器的重载,只不过不同的是,在Java中,构造器的名称和Java类的类名一致,而Scala中,辅助构造器的名称用this来代替。比较方便的是,Scala中如果类名写错了,那么直接改类名就成,而在Java中,则需要对修改每一个构造器的名称。


7.4.2 内部类

在Scala中,可以在任何语法结构中内嵌任何语法结构,即在函数中也可以定义一个新的函数,在类中也可以定义类,相当于Java里面的内部类,如代码示例:

object PersonObject {
  def main(args: Array[String]): Unit = {
    val p = new Person
    var man = new p.Man
    var woman = new p.Woman
    man.manWork()
    woman.womanWork()
  }
  
  class Person { 
   
    class Man {
      def manWork() {
        println("The man is very strong!")
      }
    }
    
    class Woman {
      def womanWork() {
        println("The woman is very beatiful!")
      }
    }
  }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值