Java构造方法\构造器
说明,构造器(constructor)
- 构造器的修饰符可以是默认的,也可以是public protected private
- 构造器没有返回值
- 方法名 和类名必须一样
- 参数列表 和 成员方法一样的规则
- 构造器的调用系统完成
构造器是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。它有几个特点:
- 方法名和类名相同
- 没有返回值
- 咋创建对象时,系统会自动的调用该类的构造器完成对象的初始化,并不是创建对象
快速入门
package com.demo.day;
public class day02 {
public static void main(String[] args) {
Person1 p1 = new Person1("游书恒",21);
System.out.println("p1的信息如下:");
System.out.println("p1的对象name=" + p1.name);
System.out.println("p1的对象age=" + p1.age);
}
}
class Person1{
String name;
int age;
/*构造器
1.构造器没有返回值,也不能写void
2.构造器的名称和类Person1一样
3.(String pName,int pAge)是形参列表,规则和成员方法一样
*/
public Person1(String pName,int pAge){ //构造方法名与类名一致、没有返回值
System.out.println("构造器被调用~~ 完成对象的属性初始化");
name = pName;
age = pAge;
}
}
注意事项和细节1
- 一个类可以定义多个不同的构造器,即构造器的重载
- 构造器和类名要相同
- 构造器没有返回值
- 构造器是完成对象的初始化,不是创建对象
- 在创建对象时,系统自动调用该类的构造方法
package com.demo.day;
public class day03 {
public static void main(String[] args) {
Test t1 = new Test("king",21);
Test t2 = new Test("jack");
}
}
class Test{
String name;
int age; //默认 0
//第一个构造器
public Test(String pname ,int page){
name = pname;
age = page;
}
//第二个构造器
public Test(String pname){
name = pname;
}
}
注意事项和细节2
- 如果程序员没有定义构造器,系统会自动给类生成一个默认无参构造器
- 一旦定义了自己的构造器,默认的构造器就覆盖了,就不能再使用默认的无参构造器,除非显式的定义一下,即:Dog(){}
class Dog{
String name;
int age;
}
此时的 Dog 类只有一个默认的无参构造器,我们用javap反编译来查看:
下面我们来定义一个有参构造器:
class Dog{
String name;
int age;
//默认构造器
public Dog(String pname){
name = pname;
}
}
可以看到我们自定义的有参构造器,但与此同时我们默认隐士的无参构造器也被覆盖了,这意味着往后创建该类的对象时都不能再以无参的方式去创建,除非显式的定义一下:
class Dog{
String name;
int age;
//默认构造器
public Dog(){
}
//自定义构造器
public Dog(String pname){
name = pname;
}
}
构造器流程分析
class Person{
int age = 90; //缺省0
String name; //缺省null
Person(String n,int a){
name = n;//给属性赋值
age = a;
}
}
Person p = new Person("小倩",20);
- 加载Person类信息(Person.class),只会加载一次
- 在堆中分配空间(地址)
- 完成对象的初始化
- 【3.1 默认初始化 age=0,name=null】
- 【3.2 显式初始化age=90,name=null】
- 【3.3 构造器初始化 age = 20】
- 把对象在堆中的地址返回给 p (p既是对象名,也是实际对象的引用)