单例对象
package com.meng.nan.day715
import scala.collection.mutable.ArrayBuffer
object SingletonClass {
def main(args: Array[String]): Unit = {
//单例对象不需要new,用类名.方法名调用对象中的方法
val session=SessionFactory.getSession()
println(session.toString)
}
}
//创建类
object SessionFactory{
//该部分相当于java中的静态块
//object中的方法都是静态方法字段都是静态字段
var counts=5;
val sessions=new ArrayBuffer[Session]()
while(counts>0){
sessions+=new Session
println(sessions.toBuffer)
counts-=1
}
//在object中的方法相当于java中的静态方法
def getSession():Session={
sessions.remove(0)
}
}
//类
class Session{}
//伴生对象,伴生类
/**
在 Scala 的类中,与类名相同的单例对象叫做伴生对象,也就是说如果我们在 object Dog 所
在的文件内定义了一个 class Dog,此时:
1、 object Dog 被称为 class Dog 的伴生对象
2、 class Dog 被称为 object Dog 的伴生类
3、 类和伴生对象之间可以相互访问私有的方法和属性
伴生类 和 伴生对象 之间可以互相访问对方的私有属性
*/
package com.meng.nan.day715
//伴生类和伴生对象
object AssociatedClass {
//伴生对象的私有属性
private val CONSTANT:String="小花"
def main(args: Array[String]): Unit = {
val ac=new AssociatedClass
//访问私有字段name
ac.name="小强"
ac.printName()
}
}
class AssociatedClass{
val id=100
private var name="小明"
def printName(): Unit ={
//在类中可以访问伴生对象的私有属性
println(AssociatedClass.CONSTANT+name)
}
}
抽象类
package com.meng.nan.day715
//scala中的抽象类与java中的抽象类基本一致
/**
- 抽象类是一种不能被实例化的类,抽象类中包括了若干不能完整定义的方法,这些方法由子
- 类去扩展定义自己的实现。
- 1、如果在父类中,有某些方法无法立即实现,而需要依赖不同的子类来覆盖,重写实现自
- 己不同的方法实现。此时可以将父类中的这些方法不给出具体的实现,只有方法签名,这
- 种方法就是抽象方法。
- 2、而一个类中如果有一个抽象方法,那么类就必须用 abstract 来声明为抽象类,此时抽象
- 类是不可以实例化的 3、在子类中覆盖抽象类的抽象方法时,不需要使用 override 关键字
*/
object AbstractClass {
def main(args: Array[String]): Unit = {
val a=new Cat
a.eat
}
}
//定义抽象类
abstract class Animal{
//抽象字段,在抽象类中可以不必进行初始化
//抽象方法
def eat:Unit
}
//子类继承抽象类,实现抽象方法
class Cat extends Animal{
//可以不加override
def eat: Unit ={
println(“这是一只偷吃鱼的小猫”)
}
}
继承
package com.meng.nan.day715
//scala中的抽象类与java中的抽象类基本一致
/**
* 抽象类是一种不能被实例化的类,抽象类中包括了若干不能完整定义的方法,这些方法由子
* 类去扩展定义自己的实现。
* 1、如果在父类中,有某些方法无法立即实现,而需要依赖不同的子类来覆盖,重写实现自
* 己不同的方法实现。此时可以将父类中的这些方法不给出具体的实现,只有方法签名,这
* 种方法就是抽象方法。
* 2、而一个类中如果有一个抽象方法,那么类就必须用 abstract 来声明为抽象类,此时抽象
* 类是不可以实例化的 3、在子类中覆盖抽象类的抽象方法时,不需要使用 override 关键字
*/
object AbstractClass {
def main(args: Array[String]): Unit = {
val a=new Cat
a.eat
}
}
//定义抽象类
abstract class Animal{
//抽象字段,在抽象类中可以不必进行初始化
//抽象方法
def eat:Unit
}
//子类继承抽象类,实现抽象方法
class Cat extends Animal{
//可以不加override
def eat: Unit ={
println("这是一只偷吃鱼的小猫")
}
}
重写和类型检查与转换
package com.meng.nan.day715
//重写
/**
* 1、Scala 中,如果子类要重写一个父类中的非抽象方法,则必须使用 override 关键字
* 2、override 关键字可以帮助我们尽早地发现代码里的错误,比如:override 修饰的父类方法
* 的方法名我们拼写错了;比如要覆盖的父类方法的参数我们写错了;等等
* 3、此外,在子类覆盖父类方法之后,如果我们在子类中就是要调用父类的被覆盖的方法呢?
* 那就可以使用 super 关键字,显式地指定要调用父类的方法
*/
object RewriteClass {
def main(args: Array[String]): Unit = {
//val sc=new SonClass
// sc.eat()
val p=new Text()
val pa=new ImTest()
println(pa.isInstanceOf[ImTest])
println(pa.isInstanceOf[ImTest])
println(classOf[ImTest])
println(pa.asInstanceOf[Text])
/**
* 判断 obj.isInstanceOf[C] obj instanc转换 obj.asInstanceOf[C] (C)obj获取 classOf[C] C.class
*/
}
}
abstract class FatherClass{
def eat()
}
class SonClass extends FatherClass{
override def eat(): Unit = {
println("马上就开饭了")
}}
class Text{
}
class ImTest extends Text{}
特质
package com.meng.nan.day715
/**
* 特质
* Scala 中的 Triat 是一种特殊的概念首先我们可以将 Trait 作为接口来使用,此时的 Triat 就与 Java 中的接口非常类似
* 在 Triat 中可以定义抽象方法,就与抽象类中的抽象方法一样,不给出方法的具体实现
* 在 Triat 中也可以定义具体方法,给出方法的具体实现在 Triat 中可以定义具体字段,也可以定义抽象字段类可以使用 extends 关键字继承 trait,注意,这里不是 implement,而是 extends,
* 在 sca中没有 implement 的概念,无论继承类还是 trait,统一都是 extends类继承 trait 后,必须实现其中的抽象方法,实现时不需要使用 override 关键字scala 不支持对类进行多继承,但是支持多重继承 trait,
* 使用 with 关键字即可
*/
object TriatClass {
def main(args: Array[String]): Unit = {
}
}
trait TestTe{
val id:Int
def add(o:Any):Boolean
def update(o:Any):Int
def query(id:String):List[Any]
}
class Imtteait extends TestTe{
//给父类抽象字段赋值
override val id: Int = 10
//实现父类抽象方法
override def add(o: Any): Boolean = true
override def update(o: Any): Int = 12
override def query(id: String): List[Any] = List(1,2,3)
}
//创建特质
//在 Scala 的
//trait 中,它不但可以包括抽象方法还可以包含字段和具体方法。
trait DAO{
//抽象字段
val id:Int
//具体字段
val name:String="hello"
//带实现的具体方法
def delete(id:String):Boolean=true
//定义一个抽象方法,不加abstract ,加了会报错
def add(o:Any):Boolean
def update(o:Any):Int
def query(id:String):List[Any]
}
混入特质
package com.meng.nan.day715
//有时我们可以在创建类的对象时,指定该对象混入某个 Trait,这样,就只有这个对象混入该
//Trait 的方法,而类的其他对象则没有
object TraitClass {
def main(args: Array[String]): Unit = {
val sd=new SmallDog("小黑")
sd.eat()
//混入特质
val sd1=new SmallDog("小白") with Cat1
sd1.eat()
}
}
trait Animal1{
def log(msg:String){}
}
trait Dog1 extends Animal1{
override def log(msg:String){
println("小狗"+msg)
}}
trait Cat1 extends Animal1{
override def log(msg: String): Unit = {
println("小猫"+msg)
}
}
class SmallDog(val name:String) extends Dog1 {
def eat(): Unit ={
println(name+"在吃东西")
log("今天的食物挺好吃")
}
}
特质的调用链
package com.meng.nan.day715
trait Handler {
def handler(data:String){}
}
trait Handler_A extends Handler{
override def handler(data:String): Unit = {
println("Handler_A :"+data)
//调用父类特质
super.handler(data)
} }
trait Handler_B extends Handler{
override def handler(data:String): Unit = {
println("Handler_B :"+data)
super.handler(data)
} }
trait Handler_C extends Handler{
override def handler(data:String): Unit = {
println("Handler_C :"+data)
super.handler(data)
} }
class Person_TraitChain(val name:String) extends Handler_C with Handler_B with
Handler_A{
def sayHello={
println("Hello "+name)
handler(name)
} }
object TraitChain_Test{
def main(args: Array[String]) {
val p=new Person_TraitChain("zhangxiaolong");
p.sayHello
} }