Scala入门三——面向对象

1. 类的声明和private关键字说明

package com.ghq.scala.oo


/**
 * private[ghq]:限定当前类的访问包路径为ghq,及其子包
 * 
 * Person 后面跟的private限定该类的构造方法为私有,只有该类的伴生对象可以使用构造方法
 * 
 * Person 后面跟的private[this] 限定该类的构造方法为私有,该类的伴生对象也不可以使用构造方法
 */
private[ghq] class Person private {

  val id = 23
  var name = "zhangsan"

  //private:限定该属性只能由本类或者其伴生对象访问
  private var gender = "male"

  //private[this]:限定该属性只能由本类访问
  private[this] var addr:String = _

  def getAddr():String={
    addr
  }

}

/**
 * object Person 称之为 class Person的伴生对象
 */
object Person{
  def main(args: Array[String]): Unit = {
    val p = new Person
    println(p.id)
    println(p.name)
    println(p.gender)//可以访问伴生类里面的private修饰的属性
    //println(p.addr)//不可以访问伴生类里面的private[this] 修饰的属性

    println(p.getAddr)
  }
}

object Animal{
  def main(args: Array[String]): Unit = {
    //val p = new Person //constructor Person in class Person cannot be accessed in object Animal
  }
}

2. 构造方法,构造方法重载和apply方法

package com.ghq.scala.oo

import scala.io.Source

/**
 * 默认该类有一个主构造器 无参的
 * 主构造器和类可以同时存在
 * 
 * gender:String: 相当于有private[this]修饰
 * var age:Int = 2:直接给出默认值
 */
class Dog private(val name:String = "",var furColor:String,gender:String,var age:Int = 2){

  //在new的时候,主构造器都会执行
  val a = 123
  println(a)
  //读取文件
  try {
    val file = Source.fromFile("D:\\aa.txt").mkString
    println(file)
  } catch {
    case t: Exception => t.printStackTrace() // TODO: handle error
  }finally {
    println("finally")
  }

  def sayHi :Unit={
    println("hi")
  }
}

object Dog{
  def main(args: Array[String]): Unit = {
    val dog = new Dog("dahuang","黄色","female",3)
    println(dog.name)

    //dog.name = "小黑"//reassignment to val
    println(dog.furColor)
    println(dog.name)
    println(dog.age)
  }
}
package com.ghq.scala.oo

class Student(){
  var id : Int = _
  var name : String = _
  var gender : String = _
  var addr : String = _

  def this(id:Int,name:String,gender:String){
    this
    this.id = id
    this.name = name
    this.gender = gender
  }
  def this(id:Int,name:String,gender:String,addr:String){
    this
    this.id = id
    this.name = name
    this.gender = gender
    this.addr = addr
  }


}

object Student{

  def apply():Unit = {
    println(11)
  }

  def apply(id:Int):Student = {

    println("apply(id:Int):Int")
    new Student
  }

  def main(args: Array[String]): Unit = {
    //var stu = new Student(1,"zhangsna","male")

    var s1 = Student
    println(s1)//com.ghq.scala.oo.Student$@5f184fc6
    var s2 = Student
    println(s2)//com.ghq.scala.oo.Student$@5f184fc6


    var s3 = Student()//调用了apply 方法

    var s4 = Student(3)//调用了apply(Int) 方法
  }
}

3. 接口,特质

package com.ghq.scala.extend

/**
 * trait:特质,类似java中的interface
 * 
 * trait中的方法可以有实现,
 */
trait Animal {

  def run()

  //方法的实现
  def eat(): Unit={
    println("eat")
  }
}

class Person extends Animal {

  @Override
  override def run(): Unit = {
    println("run")
  }


  //重写trait中实现的方法,该方法必须有关键字override修饰
  override def eat(): Unit={
    //overriding method eat in trait Animal of type ()Unit;
    //method eat needs `override' modifier
    println("eat")
  }
}

object Person{
  def main(args: Array[String]): Unit = {
    val p = new Person
    p.run()
  }
}

猜你喜欢

转载自blog.csdn.net/guo20082200/article/details/82721475