scala类的定义

1 篇文章 0 订阅
package com.ibfw

/**

* auther by bbaiggey

*/

import scala.beans.BeanProperty
import scala.collection.mutable.ArrayBuffer
/*
 * 类的定义
 * field的getter和setter
 * construction详解
 * 内部类介绍
 */
class HelloWorld{
  private var name = "leo"
  def sayHello() {
    println("Hello ,"+name)
    
  }
   def getName() = name
}


/** case1
 * 1、定义不带private的var 编译器或生产private的filed和public的getter和setter方法
 * 2、如果是private的field则生成的getter和setter也是private的
 * 3、如果定义val field 只会生成getter方法
 * 4、如果不希望生成的getter和setter 则将field声明为private[this]
 */
/*class Student{
  var name = "jack"//会生成private的name 和public的getter和setter的方法
}*/


//case2
//自定义getter和setter方法
/*class Student{
  private var myName = "jack"
  def name = "your name is "+myName
  def name_=(newName:String){//name_= 不能有空格
    println("you can not edit your name!!!")
  }
}*/
//case3 仅暴露field的getter方法
/**
 * 如果不希望field有setter方法值只需要field声明成val就可以了,但是不能修改它的值了
 * 但是如果希望能够仅仅暴露出一个getter方法,并且还能够通过某些方法修改field的值,那么
 * 需要综合使用private已经自己定义的getter方法
 * 此时,由于field是privte的所有setter和getter都是private的,对外界没有暴露,那么自己就要
 * 实现修改field值的方法:自己可以覆盖getter方法
 */
/*class Student{
  private var myName = "jack"
  def updateName(newName:String){
    if(newName=="jack")myName = newName
    else{
      println("not accept this new name")
    }
  }
  def name = "you name is  "+myName
}*/
/**
 * case4 private[this]的使用
 * 如果将field使用private来修饰,那么代表这个field是私有的,在类方法中,可以直接进行访问
 * 类的其他对象的private field
 *这种情况下 如果不希望field被其他对象访问到,那么就可以使用private[this],意味着对象私有的field
 * 只有本对象内可以访问到 
 */
/*class Student{
  private var myAge = 0
  def age_=(newAge:Int) {
    if (newAge>0) myAge = newAge
    else {
      println("illegal age!!!")
    }
  }
  def age = myAge
  def older(s:Student){
    myAge>s.age
  }
}*/
/**
 * case5 java风格的getter和setter方法
 * 1、scala的getter和setter方法的命名与java是不同的,是field和field_=
 * 2、如果让scala自动生成java风格的getter和setter犯法,只要在field添加@BeanProperty注解即可
 * 3、测试会生产4个方法,name:String、name_=(newValue:String):Unit、getName():String、setName(newValue:String):Unit
 */
/*class Student{
  @BeanProperty var name:String=_
}


class Student1(@BeanProperty var name:String)*/
/*
 * case6 Constructor
 * Scala中 可以给类定义多个辅助构造器 类似于java的构造函数重载
 * 辅助Constructor之间可以互相调用,而且必须第一行调用主构造器
 * //辅助构造器的名字叫this
 */
/*class Student{
  private var name = ""
  private var age =0
  def this(name:String){
    this()//辅助构造器的名字叫this
    this.name = name
  }
  def this(name:String,age:Int){
    this(name)
    this.age = age
  }
}*/
/**
 * case 7
 * scala中,主构造器是与类名放在一起的,与java不同
 * 而且类中,没有定义在任何方法或者是代码块之中的代码就是主Constructor的代码,这点感觉没有java那么清晰
 * //如果主Constructor传入的参数什么修饰都没有,比如 name:String , 那么如果类内部的犯法使用到了,
  //则会声明为 private[this]name ,否则没有使用该filed 就只能被Constructor代码使用而已
 */
/*class Student(val name:String,val age:Int){
  println("your name is"+name+"your age is "+age)
}
//主构造器中还可以通过使用默认参数,来给参数默认的值
class StudentConstructor(val name:String="jack",val age:Int = 12){
  println("your name is "+name+"your age is "+age)
}*/
/**
 * case8
 * Scala中同样可以在类中定义类,但是与java不同的是,每个外部类的对象的内部类,都是不同的类
 */
/*class Class{
  class Student(val name:String){}
  val student = new ArrayBuffer[Student]
  def getStudent(name:String)={
    new Student(name)
  }
 
}*/




object Test_Class extends App{
  val c = new HelloWorld
//  c.name //private只会生成private的getter和setter方法
  c.sayHello()
  c.getName//要想访问 需要自己定义公开的方法 // 也可以不加括号,如果定义方法时不带括号,则调用方法时也不能带括号
//  case1
  /*val s = new Student
  println(s.name)
  s.name="Tom" //实际生成的getter和setter方法是 name 和name_=
  println(s.name)*/
//  case2
  /*val jack = new Student
  println(jack.name)
  jack.name="123"*/
//  case3
/*  val s = new Student
  println(s.name)
  s.updateName("leo")*/
//  case4
  /*val s = new Student
  val s1 = new Student
  s.age_=(10)
  s.older(s1)*/
//  case5
/*  val s = new Student
  s.setName("jack")
//  s.name="jack"
  s.getName()
//  s.name
*/
//  case6
/*  val s1 = new Student("jack")
  val s2 = new Student("jack",18)*/
//  case7
  /*val s = new StudentConstructor*/
//  case8
/*  val c1 = new Class
  val s1 = c1.getStudent("jack")
  c1.student+=s1
  val c2 = new Class
  val s2 = c2.getStudent("jack")//在java中 这个获取的两个student是同类型的 但是在scala中不是
//  c1.student+=s2
  println(s1==s2)*/


}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值