scala语法:包,类和对象,文件,访问修饰符,属性,方法,构造方法,自定义方法,自定义函数,动态参数,隐式函数,泛型,集成和堕胎,动态混入,异常

scala语法

//包

//包申明
package cn.kgc.scalaoop.test01		//一个文件一个模块

package cn.kgc.scalaoop.test01{		//一个文件多个模块
	作用域
}


//包对象:相当于类 => 作用域(相对小)
package object packobj{				//一个包多个模块
	作用域
}

//类和对象

一个文件中只写一个类 => 类似于java
同一个文件中同名的class(伴生类)和object(单例伴生对象:运行时由虚拟机创建,程序人员直接使用)
	//scala纯粹OOP,不支持static
	//object(伴生对象):相当于给伴生类提供了静态成员
	//伴生类和伴生对象之间可以互相访问私有属性
scala中文件
	object				黄色o
	class				蓝色c
	class + object		上蓝下黄
	classes + objects	灰色图标
scala class
	访问修饰符
		private
		protected
		public	(默认)
	属性
		访问修饰符 var|val varName:Type = 初值
		属性名称和构造参数名称不能相同
	方法
		方法的参数可以通过"="号赋默认值
		返回值为方法体中最后一个表达式的结果,不使用return关键字
		构造方法
			一个主构造方法+n个辅助构造方法 :构成构造方法的重载
			class ClassName(p1:Type1,...){}
			辅助构造方法依赖主构造方法
			class ClassName(p1:Type1,...){
				def this(p1:Type1,...){			//构造方法){之间无=
					
				}
				def this(p1:Type1,...){			//构造方法){之间无=
					
				}
			}
			
		自定义方法
			方法是类的一部分
			def methodName(param*:Type):ReturnType={方法体}
				如果方法体只有一句话,则{}可以缺省
		自定义函数
			独立的对象:可以自由传递
				//本质
				class f extends Function2[Int,Int,Int]{
				  override def apply(v1: Int, v2: Int): Int = v1+v2
				}
				
				//应用
				val f = (a:Int,b:Int)=>a+b:Int
				
		函数可以作为方法的参数或返回值
			def method(f:(Type1,...)=>ReturnType)=...		//函数作为参数
			def method():(Type1,...)=>ReturnType=...		//函数作为返回值
				调用method()(v1,...)
				函数作为返回值的现象称之为柯里化
				
		动态参数 params:Type*
			带有动态参数的方法,其他参数不能有默认值
			动态参数必须是最后一个
			动态参数每传递一次增加一个维度
			
		隐式参数
			先创建隐式变量:implicit var|val VAR_NAME:Type = value
			创建带隐式参数的函数
				def method(v1:Type1,...)(implicit param:Type)=...
				
		隐式函数
			隐式函数参数
			隐式转换
			
		隐式类
			扩展某指定类型/某执行类的功能
			必须且只能有带有唯一参数的构造器,构造参数的类型决定了被扩展参数的类型
			case class T()

			implicit class Cal(v:Int){
			def sqr()=v*v
			def cub()=sqr()*v
			}

			implicit class Enc(v:String){
			def enc()=v.map(x=>(x+1).toChar)
			}

			implicit class TExt(v:T){
			def pow(a:Int,b:Int)=math.pow(a,b)
			}
			
			println(2.sqr())
			println(2.cub())
			println("abc".enc())
			println(T().pow(3, 2))
			
			
		泛型
			参数化类型可变:必须继承关系的两个类 (多态)
			参数化类型的泛化
			协变 List[+A]	面向A的超类 返回值		类型放大
			逆变 List[-A]	面向A的子类 参数		类型缩小
			不变 [T]
			
			
		闭包
			方法内应用
	
	
	//样例类:方便
		case class Student(name:String,age:Int,gender:Char){
			def me()=s"${name}\t${age}\t${gender}"
			def show()=println(me)
		}
		
		val stu1 = Student("henry",18,'男')
		stu1.show()
		
	//普通类
		class Stu(name:String,age:Int,gender:Char){
			var _name:String = name
			var _age:Int = age
			var _gender:Char = gender
			def me()=s"${_name}\t${_age}\t${_gender}"
			def show()=println(me)
		}
		
		val stu2 = new Stu("henry",18,'男')
		stu2.show()
		
	备注:数据封装:首选元组(22列以内),其次样例类
		  业务封装:特质,抽象类,普通(伴生)类|伴生对象(静态成员和方法)|包对象(独立模块如工具类)
			

//继承和多态
	class Type extends Single		单继承
	class Type with Dao1 with Dao2	多混入
	[+A]

//特质 trait
	package cn.kgc.scalajdbc.oop04{
		trait Dao[T]{
		def exeUpdate(sql:String,params:Object*):Int
		def exeQuery(sql:String,params:Object*):List[T]
		}
		trait Dao2
	}

	package cn.kgc.scalajdbc.oop05.stu {
		case class Student(name:String,age:Int,gender:Char)
		class StudentDao extends DaoBase with Dao[Student] with Dao2 {
		override def exeUpdate(sql: String, params: Object*): Int = ???
		override def exeQuery(sql: String, params: Object*): List[Student] = ???
		}

		object StudentDao extends Dao[Student] {
		override def exeUpdate(sql: String, params: Object*): Int = ???
		override def exeQuery(sql: String, params: Object*): List[Student] = ???
		}
	}
	
	//动态混入
	val fs = new FreeStudent() with Dao[Student]{
		override def exeUpdate(sql: String, params: Object*): Int = ???
		override def exeQuery(sql: String, params: Object*): List[Any] = ???
	}
	val fs2 = new FreeStudent()

实例1

package cn.kgc.scalajdbc.oop01{
  //主构造器
  class Test01(name:String="NONE",age:Int=0,gender:Char='男') { //主构造方法
    //属性
    var _name: String = name
    var _age: Int = age
    var _gender: Char = gender

    //辅助构造器
    def this(name: String, age: Int) { //辅构造器
      this(name, age, '男')
    }

    //自定义方法:无参有返回值
    def me(): String = s"${_name}\t${_age}\t${_gender}"

    //自定义方法:无参无返回值
    def show() = println(me)

    //自定义方法:有普通参数和普通返回值
    def add(a:Int,b:Int):Int=a+b

    //自定义方法:函数作为参数
    def add(a:Int,b:Int,f:(Int,Int)=>Int):Int = f(a,b)

    //定义柯里化方法:函数作为参数
    def add2(a:Int,b:Int)(f:(Int,Int)=>Int):Int = f(a,b)

    //自定义方法:函数作为返回值:柯里化正统
    def add():(Int,Int)=>Int = {
      def a(a:Int,b:Int):Int = a+b
      a
    }

    //自定义方法:传入隐式参数
    def add(arr:Array[Int])(implicit initVal:Int) = {
      var rst:Int = initVal
      //arr.foreach(x=>rst=rst+x)
      for (elem <- arr) {
        rst = rst + elem
      }
      rst
    }

    //自定义方法:传入隐式函数参数
    def cal(a:Int,b:Int)(implicit f:(Int,Int)=>Int):Int = f(a,b)
  }
  object Test01 {
  }
}

实例1 Test

package cn.kgc.scalajdbc.oop01

object Test {
  def main(args: Array[String]): Unit = {
    /*val t1 = new Test01("henry",18)
    val t2 = new Test01("pola",16,'女')
    val t3 = new Test01
    t1.show()
    t2.show
    t3.show*/

    val t1 = new Test01
    //println(t1.add(1, 2))
    //println(t1.add(1, 2, _ + _))
    //println(t1.add2(1, 2)(_ + _))
    //println(t1.add()(1, 2))

    //隐式参数:隐式传值
    //implicit val initVal:Int = 5
    //println(t1.add(Array(2, 3, 4)))
    //隐式参数:显示传值
    //println(t1.add(Array(2, 3, 4))(3))

    //隐式函数
    //1、隐式转换
    /*implicit def toInt1(v:String)={
      println("implicit toInt1 invoked")
      v.toInt
    }
    implicit def toInt2(v:Double)=v.toInt
    var v:Int = "123"
    var v2:Int = 12.345
    println(v*2)
    println(v2+3)*/

    //2、隐式函数参数
    implicit def add(a:Int,b:Int):Int = a/b
    println(t1.cal(1, 2)(_-_))
  }
}

实例2

package cn.kgc.scalajdbc.oop02{
  //模块化:设计 :具体业务
  class Test01(name:String="",age:Int=0,gender:Char=Test01.DEFAULT_GENDER) {
    var _name:String = name
    var _age:Int = age
    var _gender:Char = gender
    private val PRIVATE_KEY:String = "kb12redis"

    def this(name:String,age:Int){
      this(name,age,Test01.DEFAULT_GENDER)
    }

    def me()=s"${_name}\t${_age}\t${_gender}"

    def show()=println(me)


  }

  object Test01{
    private val public_key:String = "123456"
    private val DEFAULT_GENDER:Char = '男'

    println(new Test01().PRIVATE_KEY)
  }
}

package cn.kgc.scalajdbc.oop03{
  //工具类:通用性 :
  package object util{
    val PI:Double = 3.14
    def cal()=println("aa")
    //动态参数
    def cal(params:Int*)=params.sum
  }
  object util2{
    val PI:Double = 3.14
    def cal()=println("aa")

  }
}

package cn.kgc.scalajdbc.oop04{
  trait Dao[T]{
    def exeUpdate(sql:String,params:Object*):Int
    def exeQuery(sql:String,params:Object*):List[T]
  }
  trait Dao2
}

package cn.kgc.scalajdbc.oop05.com{

  import java.sql.Connection

  abstract class DaoBase{
    def con():Connection={
      null
    }
  }
}

package cn.kgc.scalajdbc.oop05.stu {

  import cn.kgc.scalajdbc.oop04._
  import cn.kgc.scalajdbc.oop05.com.DaoBase

  case class Student(name:String,age:Int,gender:Char)
  class StudentDao extends DaoBase with Dao[Student] with Dao2 {
    override def exeUpdate(sql: String, params: Object*): Int = ???
    override def exeQuery(sql: String, params: Object*): List[Student] = ???
  }

  object StudentDao extends Dao[Student] {
    override def exeUpdate(sql: String, params: Object*): Int = ???
    override def exeQuery(sql: String, params: Object*): List[Student] = ???
  }

  class FreeStudent
}

实例2 Test

package cn.kgc.scalajdbc.oop02

object Test {

  case class T()

  implicit class Cal(v:Int){
    def sqr()=v*v
    def cub()=sqr()*v
  }

  implicit class Enc(v:String){
    def enc()=v.map(x=>(x+1).toChar)
  }

  implicit class TExt(v:T){
    def pow(a:Int,b:Int)=math.pow(a,b)
  }

  abstract class Math[-T,+R]{
    def func(t:T):R
  }

  class F(v:Int){var _v:Int = v;}
  class S(v:Int) extends F(v:Int)
  class G(v:Int) extends S(v:Int)

  case class A(name:String,age:Int)
  case class B()

  class Add extends Math[S,S]{
    override def func(t: S): S = new S(t._v*t._v)
  }

  class Collect[-A](a:A*){}

  //样例类
  case class Student(name:String,age:Int,gender:Char){
    def me()=s"${name}\t${age}\t${gender}"
    def show()=println(me)
  }
  //普通类
  class Stu(name:String,age:Int,gender:Char){
    var _name:String = name
    var _age:Int = age
    var _gender:Char = gender
    def me()=s"${_name}\t${_age}\t${_gender}"
    def show()=println(me)
  }


  def main(args: Array[String]): Unit = {
    //println(new Test01()._age)
    import scala.math._
    import cn.kgc.scalajdbc.oop02.Test01
    /*import cn.kgc.scalajdbc.oop03.util._
    cal()
    println(cal(2, 3, 4))*/

    /*println(2.sqr())
    println(2.cub())
    println("abc".enc())
    println(T().pow(3, 2))*/

    //println(new Add().func(new S(2))._v)

    /*new Collect[F](new S(2))
    new Collect[S](new G(2))
    new Collect[G](new G(2))*/

    /*var ratio:Float = 0.892f
    def func(v:Int)={
      v*ratio
    }

    var a:Int = 5
    a*ratio*/

    /*val stu1 = Student("henry",18,'男')
    val stu2 = new Stu("henry",18,'男')
    stu1.show()
    stu2.show()*/

    /*import cn.kgc.scalajdbc.oop05.stu.FreeStudent
    import cn.kgc.scalajdbc.oop04._
    val fs = new FreeStudent() with Dao[Student]{
      override def exeUpdate(sql: String, params: Object*): Int = ???
      override def exeQuery(sql: String, params: Object*): List[Student] = ???
    }
    val fs2 = new FreeStudent()*/
  }
}

异常

package cn.kgc.scalajdbc.oop7

object ExceptionTest {
  def main(args: Array[String]): Unit = {
    //异常
    //编译异常 try catch    运行时异常  程序逻辑
    try{
      val arr = Array(1,2.0)
      val ix = 1
      if(ix>=arr.length){
        throw new ArrayIndexOutOfBoundsException("index $ix out of bounds")
      }
      if(0==arr(1)){
        throw new ArithmeticException("/by zero")
      }
      println(arr(0)/arr(1))
    }catch{
      case e:IndexOutOfBoundsException=>println(e.getMessage)
      case e:ArithmeticException=>println(e.getMessage)
      case _=> println("unkown error")
    }finally {
      println("finally")
    }


    //有两个值有3个值得 用collect偏函数把只有2个值得映射出来
    Array(("henry",19,"male"),("jack",19),("pola",16,"female"),("ariel",8))
      .collect({
        case (a,b)=>s"$a\t$b"               //假如2个就输出2个
        case (a,b,"male")=>s"$a\t$b\tmale" //假如2个+male   输出 两个+male
      })
      .foreach(println)


    //运行时异常在scala中是怎么处理的
    import scala.collection.mutable.Map
    def cal1(a:Int,b:Int):Map[String,Any]={
      val rst = Map[String,Any]()
      if(0==b){
        rst.put("exception",new ArithmeticException("/by zero"))
      }else{
        rst.put("result",a/b)
      }
      rst
    }
    def cal2(a:Int,b:Int):Option[Float]={   //用Option一般是避免异常发生 用判断规避它
      if(0==b){
        Option.empty
      }else{
        Some(a*1.0f/b)
      }
    }
    //推荐用下面这个
    def cal3(a:Int,b:Int):Either[ArithmeticException,Float]={
      if(0==b){
        Left(new ArithmeticException("/by zero"))
      }else{
       Right(a*1.0f/b)
      }
    }
    val value: Either[ArithmeticException, Float] = cal3(1, 2)
    if(value.isLeft){
      println(value.left.get)
    }else{
      println(value.right.get)
    }



  }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值