Java构造方法\构造器

说明,构造器(constructor)

  1. 构造器的修饰符可以是默认的,也可以是public protected private
  2. 构造器没有返回值
  3. 方法名 和类名必须一样
  4. 参数列表 和 成员方法一样的规则
  5. 构造器的调用系统完成

构造器是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。它有几个特点:

  • 方法名和类名相同
  • 没有返回值
  • 咋创建对象时,系统会自动的调用该类的构造器完成对象的初始化,并不是创建对象

快速入门

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

  1. 一个类可以定义多个不同的构造器,即构造器的重载
  2. 构造器和类名要相同
  3. 构造器没有返回值
  4. 构造器是完成对象的初始化,不是创建对象
  5. 在创建对象时,系统自动调用该类的构造方法
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

  1. 如果程序员没有定义构造器,系统会自动给类生成一个默认无参构造器
  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);
  1. 加载Person类信息(Person.class),只会加载一次
  2. 在堆中分配空间(地址)
  3. 完成对象的初始化
    • 【3.1 默认初始化 age=0,name=null】
    • 【3.2 显式初始化age=90,name=null】
    • 【3.3 构造器初始化 age = 20】
  4. 把对象在堆中的地址返回给 p (p既是对象名,也是实际对象的引用)
posted @ 2023-05-13 23:12  Hello_world_名字被取了  Views(11)  Comments(0Edit  收藏  举报