1 直接使用伴生类的构造函数
object Test {
def main(args: Array[String]): Unit = {
val user: User = new User
}
}
class User{
}
2 使用伴生对象的apply方法(间接使用伴生类的构造函数)
object Test {
def main(args: Array[String]): Unit = {
val user: User = User.apply()
// 也可以省略为 val user: User = User()
}
}
class User{}
object User{
def apply() = {
new User
}
}
3 使用反射(使用Predef提供的classOf方法)
object Test {
def main(args: Array[String]): Unit = {
val clazz: Class[User] = classOf[User]
val user = clazz.newInstance()
}
}
class User{}
4 使用clone方法
前提:类要继承Clonable特质,重写clone方法。利用已有对象,克隆出新的对象。
object Test {
def main(args: Array[String]): Unit = {
val user1: User = new User
println("user1: " + user1)
val user2: User = user1.clone()
println("user2: " + user2)
println(user1 eq user2) // 比较内存地址
}
}
class User extends Cloneable {
var name = "zhangsan"
var age = 20
override def clone(): User = {
var user : User = null
try{
user = super.clone().asInstanceOf[User]
}catch{
case ex : Exception => println(ex.getMessage)
}
user
}
override def toString: String = s"User{name=$name, age=$age}"
}
运行结果:
user1: User{name=zhangsan, age=20}
user2: User{name=zhangsan, age=20}
false // 内存地址不一样,说明是两个不同的对象
5 使用反序列化
客户端向服务器发送序列化后的class对象或者实例对象,服务器接收后经过反序列化,可以直接获得class对象或实例对象。class对象则可以直接用newInstance方法创建新对象,或者通过传递实例对象调用clone方法,进行对象克隆。