在生活和学习中,懂得拿捏对象是非常重要的!
本篇我们用Scala和Java来定义一个类,一起来看看Scala在搞定对象方面有啥厉害的地方。
Scala class
class Person(val name: String, var age: Int) {
override def toString: String = {
s"$name's age is $age"
}
def apply(): Unit = {
println(toString)
}
def apply(age: Int): Unit = {
this.age = age
println(toString)
}
}
Java class
class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return String.format("%s's age is %s", name, age);
}
public void print() {
System.out.println(this.toString());
}
}
比较上面这两段代码,
- Scala的主构造函数就在class的定义中
class Person(val name: String, var age: Int)
, 同时他定义了两个成员变量 name & age, 而Java中是需要显示定义成员变量和构造函数的。确实Scala用法更简洁优雅:
// Scala的类定义就是其构造函数
val tina = new Person("Tina", 13)
println(tina.name) // Tina
println(tina.age) // 13
// Java需要显示定义构造函数和成员变量
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
- Scala有
apply()
方法,可以不用指定方法名调用,特别是如果把apply()
方法定义在class的伴生对象中,可以不用new
关键字来创建对象,示例如下:
object Person {
def apply(name: String, age: Int = 18): Person = {
new Person(name, age)
}
}
val robby = Person(name = "robby") // 不需要new关键字,调用伴生对象中的 apply(name: String, age: Int = 18)
robby() // robby's age is 18
总结
Scala在类的定义,对象的创建上又提供了很多好用的语法糖,如果使用熟练了,确实可以事半功倍,提高效率,也使代码更加简洁优雅。
完整代码
- Scala
object ObjectCreationInScala {
class Person(val name: String, var age: Int) { // 定义主构造函数和成员变量
def apply(): Unit = {
println(toString)
}
def apply(age: Int): Unit = {
this.age = age
println(toString)
}
override def toString: String = {
s"$name's age is $age"
}
}
object Person {
def apply(name: String, age: Int = 18): Person = {
new Person(name, age)
}
}
def main(args: Array[String]): Unit = {
val tina = new Person("Tina", 13)
println(tina.name) // Tina
println(tina.age) // 13
tina() // Tina's age is 13
tina(20) // Tina's age is 20
val robby = Person(name = "robby") // 不需要new关键字,调用伴生对象中的 apply(name: String, age: Int = 18)
robby() // robby's age is 18
}
}
- Java
public class ObjectCreationInJava {
static class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return String.format("%s's age is %s", name, age);
}
public void print() {
System.out.println(this.toString());
}
}
public static void main(String[] args) {
Person tina = new Person("Tina", 13);
System.out.println(tina.name); // Tina
System.out.println(tina.age); // 13
tina.print(); // Tina's age is 13
}
}
标签:String,Scala,age,Person,tina,Constructor,println,Class,name
From: https://blog.csdn.net/robbywt/article/details/142171769