applay内部实现
先定义一个数组,通过数组来理解apply方法
val array1 = Array(1,2,3,4,5,6,7,8,9)
由源码可以知道,上面定义的数组调用了apply方法,内部同样也new了一个数组,然后通过for循环将值赋给定义的数组,这样就省去了我们一个一个的为数组赋值了
def apply(x: Int, xs: Int*): Array[Int] = {
val array = new Array[Int](xs.length + 1)
array(0) = x
var i = 1
for (x <- xs.iterator) { array(i) = x; i += 1 }
array
}
同理,如果我们定义一个类,其构造器私有,这时只有伴生对象能够访问伴生类的构造器,我们就可以通过伴生对象来获得伴生类的对象
object ApplyTest {
def main(args: Array[String]): Unit = {
val array = new Array[Int](10)
val dog = new Dog("小黄", 18)//构造器被私有,除伴生对象外的组件是不能创建对象的
//由于Dog类的构造器私有了,所以通过访问伴生对象的apply方法获得对象
val dog = Dog("小黑",18)
println(dog.name)
}
}
//类的构造器被私有,只有其伴生对象能访问
class Dog private(val name:String, val age:Int){
}
//伴生对象
object Dog{
def apply(name: String, age: Int): Dog = {
new Dog(name, age)//最后一行为返回值,scala中不需要return关键字
}
}
总结:
1,至少我们知道,但看语法情况下,当类的构造器被私有,可以不用new关键字,获得类的对象,当然前提是,伴生对象有apply方法返回其伴生类的对象
App
/**
* App是应用程序对象,这个类必须是object不能是class
* 测试时不需要定义main方法,就能执行程序
*
* App中定义了main方法的执行逻辑,把自定义的object类中{}中所有代码直接放在main方法中执行
* 由于main方法中我们可以传参,现在我们命令行执行代码包时就不能传参了
*/
object ApplyTest extends App {
println("hello scala")//当单例对象继承了App后,不用在main方法中就能执行程序
}
object Dog{//必须在main方法中才能执行程序
def main(args: Array[String]): Unit = {
println("hello scala")
}
}