scala中class创建的是伴生类,object创建的是伴生对象
伴生类中可以声明无参构造器和有参构造器,辅助构造器,属性,方法
伴生对象属于单例对象,也可以声明属性,方法,但是不可以声明构造器
scala创建对象可以通过new的方式也可以通过伴生对象的方式进行创建。但是如果想用伴生对象的方式进行创建就必须定义apply方法,在apply方法中通过new的方式创建对象。
val dog = Dog 默认是dog指向单列对象
val dog = Dog(“aa”)带有参数的就默认会调用单列对象的apply方法,如果单列对象中没有定义apply方法就会报错。apply方法属于伴生对象和伴生类的一个桥梁
参考Array的apply方法源码:
/** Creates an array of Intobjects */
// Subject to a compiler optimization in Cleanup, see above.
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
}
伴生对象和伴生类的简单介绍之代码:
// 伴生类
class Dog {
// val修饰:能访问,不能修改,相当于java中定义的一个成员变量,有getter方法,没有setter方法
val id:Int = 9527
//var修饰: 能访问,也能修改,相当于有getter,setter方法
var age:Int = 3
//private val修饰: 只能自己和伴生对象访问
private val nickname:String = “旺财”
// private[this] val修饰:相当于java中的private,只能自己访问
private[this] val name:String = “小黄”
private def printSalary(): Unit ={
/**
* 伴生对象中的属性相当于java中的静态变量,方法相当于静态方法: static double salary;
*/
println(Dog.salary)
val dog1 = new Dog();
println(Dog.myAge())
println(Dog.name)
}
}
/**
伴生对象
有object Dog也有class Dog
单例类
有object Dog没有class Dog
互为伴生关系的类和对象可以互相访问对方的使用private修饰的变量和方法
*/
// 在Dog类中,声明了一个 private val nickname:String = “旺财” 这样的变量
object Dog{
var name:String = “huangbo”
private val salary:Double = 1000000
// 这个方法一定被static修饰了。
def myAge():Int = {
return 18
}
def main(args: Array[String]): Unit = {
val dog:Dog = new Dog()
println(dog.id)
// 会报错 dog.id = 777
println(dog.age)
dog.age = 4
println(dog.age)
println(dog.nickname)
// 会报错 println(dog.name)
println(dog.printSalary())
}
}
了解更多大数据培训就业面试问题欢迎关注小编!