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中可以在任何语法结构中内嵌任何语法结构