JAVA构造器

JAVA对象初始化数据域的方法

在声明中赋值

显示域初始化

可以在类定义中,直接将一个值赋给任何域
例如:

class Employee {
    ...
    private String name =“”;
    ...
}

在执行构造器之前,先执行赋值操作。当一个类的所有构造器都希望把相同的值赋予某个特定的实例域时,这种凡是特别有用。
在C ++中,不能直接初始化类的实例域,所有的域必须在构造器中设置

初始化块

在一个类的声明中,可以包含多个代码块,只要构造类的对象,这些块就会被执行。
例如:

{
    id = nextId;
    nextId ++;
}

在此例中,如论使用那个构造器构造对象,ID域都在对象初始化块中被初始化。
首先运行初始化块,然后才运行构造器的追部分。
如果对类的静态域进行初始化的代码比较复杂,那么可以使用静态的初始化块,将代码放在一个块中,并标记关键字静态的。
例如

静态的 {
    随机生成器= new Random();
    //将nextId设置为0到9999之间的随机数
    nextId = generator.nextInt(1000);
}

在构造器中设置值

构造器与类同名,将对象实例域初始化为所希望的状态。
例如:zai gouzao Employee类的对象时,使用代码new Employee(“Bob”,10000);会会把实例域设置为

name =“Bob”;
薪水= 10000;

构造器与其他方法有一个重要的不同之处。
构造器总是伴随着新的操作符的执行被调用,而不能对一个已经存在的对象调用构造器来达到重新设置实例域的目的。
- 总结
1.构造器与类同名(public employeeee())
2.每个类可以有一个以上的构造器(通过重载实现)
3.构造器可以有0个,1个或多个参数
4.构造器没有返回值
5.构造器总是伴随着 new 操作一起调用

通过重载类的构造器方法,可以采用多种形式设置类的实例域的初始状态。
无参数的构造器

对象由无参数构造函数创建时,其状态会设置称适当的默认值。

  • 默认域初始化
    如果在构造器中没有显示地给域赋予初值,那么就会被自动地赋为默认值:
    数值为0,布尔值为false,对象引用为null
    例如:
public Employee(){
    name =“”;
    薪水= 0;
}

如果在编写一个类时没有编写构造器,那么系统就会提供一个无参数构造器。(当且仅当类没有提供任何构造器时)这个构造器将所有的实例域设置成默认值。
如果类中提供了至少一个构造器,但是没有提供无参数的构造器,则在构造对象时如果没有提供参数就会被视为不合法.

带参数的构造器

例如:

public Employee(String n,double s){
    name = n;
    salary = s;
    }

但是在编写构造器中,常常在参数命名上出现错误。
有一种常用的技巧,使用这个这个隐式参数
例如:

public Employee(String name,double salary){
    this.name = name;
    this.alary =工资;
    }
调用另一个构造器

关键字此引用方法的隐式参数。
如果构造器的第一个语句形如这(...),这个构造器将调用同一个类的另一个构造器。
例如:

公务员(双人){
    //调用Employee(String,double)构造函数
    这个(“员工#”+ nextId,s);
}

这样使得公共的构造器代码部分只编写一次即可。

总结

调用构造器的具体处理步骤:
1.所有域被初始化为默认域(0,假或空)
2.按照在类声明中出现的次序,一次执行所有域初始化语句和初始化块。
3.如果构造器第一行调用了另外的构造器,则执行另外一个构造器。
4.执行这个构造器的主体。

代码实例

/ **
 *该程序演示了对象构造
 * /
package ConstructorTest;
import java.util。*;
public class ConstructorTest {
    public static void main(String [] args){
        //用三个Employee对象填充staff数组
        员工[]员工=新员工[3];

        工作人员[0] =新员工(“哈利”,40000);
        工作人员[1] =新员工(60000);
        staff [2] = new Employee();

        //打印出有关所有Employee对象的信息
        for(员工e:员工){
            System.out.println(“name =”+ e.getName()+“,id =”+ e.getId()+“,salary =”+ e.getSalary());
        }

    }

}

class Employee {
    private static int nextId;

    private int id;
    private String name =“”; //实例字段初始化
    私人双薪;

    //静态初始化块
    静态的 {
        随机生成器= new Random();
        //将nextId设置为0到9999之间的随机数
        nextId = generator.nextInt(1000);
    }

    //对象初始化块
    {
        id = nextId;
        nextId ++;
    }

    //三个重载构造函数
    public Employee(String n,double s){
        name = n;
        salary = s;
    }

    公务员(双人){
        //调用Employee(String,double)构造函数
        这个(“员工#”+ nextId,s);
    }

    //默认构造函数
    public Employee(){
        //名称初始化为“” - 见上文
        //工资未明确设置 - 初始化为0
        //在初始化块中初始化的id
    }

    public String getName(){
        返回名称;
    }
    public double getSalary(){
        回报工资;
    }
    public int getId(){
        返回id;
    }
}

运行结果

![这里写图片描述(https://img-blog.csdn.net/2018080713593297?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x5bl8wMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值