Scala入门到精通——第六节:类和对象(一)

本篇博客探讨Scala中的类与对象,包括类定义、主构造器和辅助构造函数。介绍了Scala如何生成getter、setter,以及主构造器的默认参数和访问控制。同时阐述了辅助构造函数的作用,强调在禁用主构造器时如何使用它们。
摘要由CSDN通过智能技术生成

本节主要内容

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 
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值