上一章节快速入门案例中是先创建一个猫对象,再给猫的属性赋值,现在要求在创建猫对象的时候,就直接指定猫的姓名、年龄和颜色,这个时候该怎么做呢?【使用构造方法,也称为构造器】
构造器的作用:完成对象的初始化,注意构造器是没有返回值的
Java(回顾)
public class Constructor {
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person("李四", 22);
System.out.println("p1 = " + p1);
System.out.println("p2 = " + p2);
}
}
/**
* Person类
* 语法:
* [修饰符] 方法名(形参列表) {
* 构造方法体
* }
*/
class Person {
public Person() {
this.name = "张三";
this.age = 18;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
private String name;
private int age;
@Override
public String toString() {
return "[name=" + name + ", age=" + age + "]";
}
}
📝 详细说明
- 在 Java 中,一个类可以定义多个不同的构造器,这些构造器重载
- 如果代码中没有显式定义构造器,那么系统会自动生成一个默认的无参构造器
- 如果代码中显式定义了构造器,那么默认的无参构造器就被覆盖了,不能再使用
Scala
Scala 创建对象时也需要调用构造器,且构造器支持重载
Scala 的构造器包括:主构造器和辅助构造器 ```scala object Constructor { def main(args: Array[String]): Unit = { val p: Person = new Person(“张三”, 18) println(p.toString) } }
/**
- Person类
- 语法:
- class 类名(形参列表) { // 主构造器
- def this(形参列表) {} // 辅助构造器
} */ class Person(inName: String, inAge: Int) { var name: String = inName var age: Int = inAge
def this() { this(“小明”, 10) }
def this(name: String) { this(name, 10) println(“初始化成功~~~”) }
// 重写 toString 方法 override def toString: String = s”[ name=${this.name}, age=${this.age}]” } ``` 📝 详细说明
👉 1. 主构造器
- 主构造器的声明直接放在类名之后
- 主构造器会执行类中定义的所有语句
- 主构造器无参时,小括号可以省略,此时在创建对象时小括号也可以省略
👉 2. 辅助构造器
- 辅助构造器的声明不能和主构造器一样,否则会发生错误
- 辅助构造器可以有多个,名称为 this,只是形参列表不同
- 辅助构造器第一行必须显式调用其他构造器,无论是直接还是间接,最终一定要执行主构造器
- 如果只想通过辅助构造器创建对象,那么可以私有化主构造器,比如:
class Person private(...)