Scala中声明一个类

1⃣️创建一个简单的类

Java

public class JavaPeople {
    private final String name;
    private Integer age;

    public JavaPeople(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

Scala

/**
  * @author sparrow
  * val : 相当于声明一个不可变的变量
  * var : 相当于声明可变的变量
  * 声明的变量都是 private
  * 类默认是 public
  */
class People(val name: String, var age: Int)

是不是感觉很清爽!!看一下Scala编译后的class文件反编译之后的结果:

public class People
{
  private final String name;
  
  public People(String name, int age) {}
  
  public void age_$eq(int x$1)
  {
    this.age = x$1;
  }
  
  public int age()
  {
    return this.age;
  }
  
  public String name()
  {
    return this.name;
  }
}

可以,看出Scala会自动生成包含所有参数的构造函数以及每个参数的get,set方法

2⃣️类中的变量,方法,以及构造函数

/**
  * @author sparrow
  * val : 相当于声明一个不可变的变量
  * var : 相当于声明可变的变量
  * 声明的变量都是 private
  * 类默认是 public
  * 类名后的参数就是主构造器的参数,主构造器会执行代码体里面的字段和语句
  */
class People(val name: String, var age: Int) {

  /**
    * 变量必须初始化,_表示这个类型的默认值
    * 有附加的private访问权限会在访问方法上体现出来
    */
  private var address: String = _

  def this(name: String, age: Int, address: String) {
    //辅助构造函数的第一行,必须调用主构造函数或者其它辅助构造函数
    this(name, age)
    this.address = address
  }

}
  • 为什么变量一定要初始化:主构造器会执行类定义中的所有字段,执行类体中的所有语句
  • 为什么辅助构造函数一定要在第一行调用主构造函数:因为主构造器不仅仅创建一个对象,并且会执行代码块中的语句,如果语句是必须的,辅助构造器不调用主构造器的话,会出现不可控的情况

编译后的代码:

public class People
{
  private final String name;
  private String address;
  
  public String name()
  {
    return this.name;
  }
  
  public int age()
  {
    return this.age;
  }
  
  public void age_$eq(int x$1)
  {
    this.age = x$1;
  }
  
  private String address()
  {
    return this.address;
  }
  
  private void address_$eq(String x$1)
  {
    this.address = x$1;
  }
  
  public People(String name, int age, String address)
  {
    this(name, age);
    address_$eq(address);
  }
  
  public People(String name, int age) {}
}

3⃣️如何不使用主构造器

/**
* 将主构造器声明成private这样,实例化对象只能通过辅助构造器的方式
**/
class People private(val name: String, var age: Int) {

  /**
    * 变量必须初始化,_表示这个类型的默认值
    * 有附加的private访问权限会在访问方法上体现出来
    */
  private var address: String = _

  def this(name: String, age: Int, address: String) {
    //辅助构造函数的第一行,必须调用主构造函数或者其它辅助构造函数
    this(name, age)
    this.address = address
  }

}

4⃣️嵌套

scala中可以在任何语法结构中内嵌任何语法结构

我的个人博客,有空来坐坐

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值