本节主要内容
1 类定义、创建对象
2 主构造器
3 辅助构造器
类定义、创建对象
//采用关键字class定义
class Person {
//类成员必须初始化,否则会报错
//这里定义的是一个公有成员
var name:String=null
}
Person类在编译后会生成Person.class文件
利用javap -prviate Person命令查看字节码文件内容,可以看得到以下内容
D:\ScalaWorkspace\ScalaChapter06\bin\cn\scala\xtwy>javap -private Person
警告: 二进制文件Person包含cn.scala.xtwy.Person
Compiled from "Person.scala"
public class cn.scala.xtwy.Person {
private java.lang.String name;
public java.lang.String name();
public void name_$eq(java.lang.String);
public cn.scala.xtwy.Person();
}
从字节码文件内容可以看到:虽然我们只在Person类中定义了一个类成员(域)name,类型为String,但Scala会默认帮我们生成name()与name_=()及构造函数Person()。其中name()对应java中的getter方法,name_=()对应java中的setter方法(由于JVM中不允许出现=,所以用$eq代替。值得注意的是定义的是公有成员,但生成的字节码中却是以私有的方式实现的,生成的getter、setter方法是公有的
因此,可以直接new操作创建Person对象
//默认已经有构建函数,所以可以直接new
scala> val p=new Person()
p: Person = Person@84c504
//直接调用getter和setter方法
//setter方法
scala> p.name_=("john")
//getter方法
scala> p.name
res2: String = john
//直接修改,但其实调用的是p.name_=("jonh")
scala> p.name="jonh"
p.name: String = jonh
//getter方法
scala> p.name
res28: String = jonh
你也可以定义自己的getter和setter方法
class Person{
//定义私有成员
private var privateName:String=null;
//getter方法
def name=privateName
//setter方法
def name_=(name:String){
this.privateName=name
}
}
D:\ScalaWorkspace\ScalaChapter06\bin\cn\scala\xtwy>javap -private Person
警告: 二进制文件Person包含cn.scala.xtwy.Person
Compiled from "Person.scala"
public class cn.scala.xtwy.Person {
private java.lang.String privateName;
private java.lang.String privateName();
private void privateName_$eq(java.lang.String);
public java.lang.String name();
public void name_$eq(java.lang.String);
public cn.scala.xtwy.Person();
}
从生成的字节码中可以看出:(1)定义成私有成员,其getter、setter方法也是私有的;(2)直接能访问的是我们自己定义的getter、setter方法。下面给出的是调用方式
scala> val p=new Person()
p: Person = Person@12d0b54
scala> p.name
res29: String = null
//直接赋值法
scala> p.name="john"
p.name: String = john
scala> p.name
res30: String = john
从代码执行产生的结果,我们可以知道:通过p.name=“john”这种方式进行赋值,调用者并不需要知道是其通过方法调用还是字段访问来进行操作的,这便是著名的统一访问原则
如果类的成员域是val类型的变量,则只会生成getter方法
class Person {
//类成员必须初始化,否则会报错
//这里定义的是一个val公有成员
val name:String="john"
}
D:\ScalaWorkspace\ScalaChapter06\bin\cn\scala\xtwy>javap -private Person
警告: 二进制文件Person包含cn.scala.xtwy.Person
Compiled from "Person.scala"
public class cn.scala.xtwy.Person {
private final java.lang.String name;
public java.lang.String