1、类定义
package com.yy.oop
import scala.beans.BeanProperty
/**
* scala 类
* 类成员必须初始化
*/
class Person {
/**
* var变量默认生成java类中的getter和setter方法
* getter方法:name()
* setter方法:name_=(java.lang.String)
* 生成的变量是私有private的
* 生成的方法是公有public的
* 默认生成公有public的构造函数
*/
var name:String = null;
/**
* val变量只能生成getter方法:age()
* 变量修饰符默认:private final
*/
val age:Int =0
/**
* 变量修饰符加上private[this]
* 不会生成getter和setter方法
*/
private[this] var address:String = null;
/**
* 如果想生成getter和setter方法
* 则通过@BeanProperty实现:scala.beans.BeanProperty
*/
@BeanProperty var title:String = "Manager"
}
上述类反编译后:
D:\Program\scala\ScalaInAction\bin\com\yy\oop>javap -private Person
警告: 二进制文件Person包含com.yy.oop.Person
Compiled from "Person.scala"
public class com.yy.oop.Person {
private java.lang.String name;
private final int age;
private java.lang.String address;
private java.lang.String title;
public java.lang.String name();
public void name_$eq(java.lang.String);
public int age();
public java.lang.String title();
public void title_$eq(java.lang.String);
public void setTitle(java.lang.String);
public java.lang.String getTitle();
public com.yy.oop.Person();
}
2、主构造器和辅助构造器
package com.yy.oop
/**
* 默认无参的主构造器
*/
class Person1{
var name:String = _ //占位符
var age:Int = 26
//辅助构造器
def this(name:String){
/**
* 必须有下面这句话
* 调用辅助构造函数时,必须先调用主构造函数或其它已经定义好的构造函数。
*/
this
this.name = name;
}
def info(){
println(this.name +":" + this.age)
}
}
/**
* 有参数的主构造器
*/
class Person2(val name:String,val age:Int){
var address:String = _ //占位符
//辅助构造器
def this(name:String,age:Int,address:String){
/**
* 必须有下面这句话
* 调用辅助构造函数时,必须先调用主构造函数或其它已经定义好的构造函数。
*/
this(name,age)
this.address = address
}
def info(){
println(this.name +":" + this.age +":" + this.address)
}
}
/**
* 有参数的主构造器
* 同时带有默认值
*/
class Person3(val name:String="default name",val age:Int=100){
var address:String = _ //占位符
//辅助构造器
def this(name:String,age:Int,address:String){
/**
* 必须有下面这句话
* 调用辅助构造函数时,必须先调用主构造函数或其它已经定义好的构造函数。
*/
this(name,age)
this.address = address
}
def info(){
println(this.name +":" + this.age +":" + this.address)
}
}
/**
* 有参数的主构造器
* 同时带有默认值
* 将主构造器设置为private私有
* 不允许外部使用
*/
class Person4 private(val name:String="default name",val age:Int=100){
var address:String = _ //占位符
//辅助构造器
def this(name:String,age:Int,address:String){
/**
* 必须有下面这句话
* 调用辅助构造函数时,必须先调用主构造函数或其它已经定义好的构造函数。
*/
this(name,age)
this.address = address
}
def info(){
println(this.name +":" + this.age +":" + this.address)
}
}
object ConstructorTest {
def main(args: Array[String]): Unit = {
println("Person1:使用默认的无参主构造器");
val p1 = new Person1()
p1.name = "yy"
p1.info()
println("Person1:使用辅助构造器");
var p12 = new Person1("yyxx")
p12.info()
println("Person2:使用默认的主构造器");
val p2 = new Person2("yyy",26)
p2.info()
println("Person2:使用辅助构造器");
var p21 = new Person2("yyyy",26,"bj")
p21.info()
println("Person3:使用默认的主构造器");
val p3 = new Person3()
p3.info()
println("Person2:使用辅助构造器");
var p31 = new Person3("yyyy",26,"bj")
p31.info()
println("Person4:主构造器设置为private后,只能通过辅助构造器");
val p4 = new Person4("yyyy",26,"bj");
p4.info()
}
}
执行结果如下:
Person1:使用默认的无参主构造器
yy:26
Person1:使用辅助构造器
yyxx:26
Person2:使用默认的主构造器
yyy:26:null
Person2:使用辅助构造器
yyyy:26:bj
Person3:使用默认的主构造器
default name:100:null
Person2:使用辅助构造器
yyyy:26:bj
Person4:主构造器设置为private后,只能通过辅助构造器
yyyy:26:bj