Person类
/**
* @author WGY
*/
object Person {
}
class Person{
def hello()={
println("hello!!!!!!!")
}
}
Student类
/**
* @author WGY
*/
object Student {
implicit class Student(obj: ImplicitDemo) {
def showStuMsg(): Unit = {
println("我是一名小学生")
}
}
}
ImplicitDemo类
/**
* @author WGY
*/
class ImplicitDemo
object ImplicitDemo {
def main(args: Array[String]): Unit = {
//隐式参数
implicit var tmp:Int=5
//单个隐式参数
def fun1(a:Int)(b:Int)(implicit c:Int):Int={
a+b+c
}
//调用
println(fun1(5)(5))//----->15
println(fun1(5)(5)(10))//-----20
/*从上面两个例子可以这样理解 隐式参数就是事先设置好的参数
如果忽略不写,就会带上默认值,如果调用时赋值了参数以赋值为准
优先级:传参>默认
*/
//如果在使用隐式参数的时候就赋 默认 值那么优先级是什么样的呢
def fun2(a:Int)(b:Int)(implicit c:Int=100):Int={
a+b+c
}
println(fun2(5)(5))//----->15
println(fun2(5)(5)(1000))//----->1010
//将第8行注释结果为110 可以推断出优先级为
//传参>隐式>默认
//隐式方法
/*
在scala中如果想调用其他类的方法,可以通过隐式方法来调用
新建一个Person类 编写hello方法
*/
//编写隐式方法
implicit def implicitDemo2Person(obj:ImplicitDemo):Person=new Person
var test1=new ImplicitDemo
test1.hello()//不需要对Person新建对象就可以调用
//隐式类
/*
编写一个隐式类Student
*/
//导包
import Student._
test1.showStuMsg()//----->我是一名小学生
//对于隐式类,导包就可以使用
/*
但是,因为Student中方法参数只写了ImplicitDemo
所以除了ImplicitDemo其他类就不能直接调用Student的方法
这是只要是其他类成为ImplicitDemo的子类就可以了
也就是继承ImplicitDemo类就可以调用Student中的方法
*/
}
}