Scala 类初体验

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值