构造器(详解)

一.什么是构造器

构造器是对象初始化的工具

当我们创建对象时:

java 复制代码
Dog dog = new Dog();

上面这个圆括号"()"就代表构造器 new的作用是创建对象(开辟空间)

二.构造器的作用

当我们创建一个对象时

java 复制代码
public class Dog {
    int leg;
    String fuse;
    double price;
 
}

我们并不知道它要占多大空间,需要一开始就给它一个基础空间。java中有一个特殊的方法,这个方法跟类名相同,它就是构造器

java 复制代码
public Dog(){

}

这个方法没有返回值,它的目标是对对象进行初始化。我们在写代码时可以不写,java会帮助我们自己生成。如果没有这个方法,不进行初始化就会报错

正确写法

三.默认构造器

3.1 类名 a = new 构造器();

那么当我们给属性赋值操作分别在构造器前和构造器后,哪个才是有用的呢?

java 复制代码
/**
 * 狗类
 */
public class Dog {
    int leg = 4;
    String fuse;
    double price;

    public int getLeg() {
        return leg;
    }

    public void setLeg(int leg) {
        this.leg = leg;
    }

    public String getFuse() {
        return fuse;
    }

    public void setFuse(String fuse) {
        this.fuse = fuse;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
    public Dog(){
        leg = 3;
    }

    public static void main(String[] args) {
        Dog dog = new Dog();
        System.out.println(dog.getLeg());
    }

}

可以看到我在创建leg时已经赋值为4,而在我自己写的构造器中给leg赋值为3。那么运行main函数结果为3。当我们new对象时就会调用构造器,就像调用方法一样,所以构造器也叫构造方法。

3.2初始化的默认值

java 复制代码
/**
 * 狗类
 */
public class Dog {
    int leg;
    String fuse;
    double price;

    public int getLeg() {
        return leg;
    }

    public void setLeg(int leg) {
        this.leg = leg;
    }

    public String getFuse() {
        return fuse;
    }

    public void setFuse(String fuse) {
        this.fuse = fuse;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
    public static void main(String[] args) {
        Dog dog = new Dog();
        System.out.println(dog.getLeg());
        System.out.println(dog.getPrice());
        System.out.println(dog.getFuse());
    }

}

int---0

double---0.0

boolean---false

String---null

八个基本数据类型外---null

现在我们知道构造器是初始化内容的,那么是否可以在初始化时就赋值呢?

答案是肯定的

如图在初始化前打上断点,进入里面会跳转到构造器。这里是我自己写的构造器,那么price就会为999;

四.有参数构造器(方法)

4.1示例

为什么price是123不是999,是因为这里调用了有参数构造器

4.2全参构造器

java 复制代码
public Dog(int leg, String fuse, double price) {
        this.leg = leg;
        this.fuse = fuse;
        this.price = price;
    }

要调用全参构造器时,创建对象时参数要按顺序写。

java 复制代码
Dog dog = new Dog(4,"yellow",520.0);
java 复制代码
public Dog(){
        this.price=999;
    }
    public Dog(double price){
        this.price=price;
    }

    public Dog(int leg, String fuse, double price) {
        this.leg = leg;
        this.fuse = fuse;
        this.price = price;
    }

    public static void main(String[] args) {
        Dog dog = new Dog(4,"yellow",520.0);
        System.out.println(dog.getLeg());
        System.out.println(dog.getPrice());
        System.out.println(dog.getFuse());
        Dog dog1 = new Dog();
        System.out.println(dog1.getPrice());
    }

那么dog1的价格会是多少呢?答案是999,因为dog1调用的时第一个无参构造器。

一般写代码建议写一个无参的一个全参的。

相关推荐
古法老登瞎折腾9 小时前
大数据智能运维实战(十一):运维 MCP 的工程化——权限、限流、审计与错误处理
java·大数据·运维·spring ai·mcp
学逆向的9 小时前
C 堆区内存管理
c语言·开发语言·网络安全
huoyueyi9 小时前
《融天AI-APP从0到1开发实录》
开发语言·lua
智能运维指南10 小时前
研制过程“两张皮“怎么破:研制一体化支撑平台的定位、能力边界与落地前提
java·前端·人工智能·嘉为蓝鲸
yz_aiks11 小时前
Spring AI 2.1 ChatMemory 已过时用什么替代:迁移到 Session Memory 实战(JDBC 存储与会话压缩)
java·spring boot·大模型·ai agent·spring ai
金銀銅鐵11 小时前
[Java] 用 GUI 展示 EnumMap 增删键值对时的内部变化
java·后端·ai编程
学长毕设11 小时前
基于SpringBoot的上门洗车服务系统设计与实现
java·spring boot·后端
jason成都11 小时前
RTKLIB-Java 多基线联合RTK:FIX率从0%到91.5%的三层根因修复
java·gnss·rtklib·rtklib_java
OpenAnolis小助手11 小时前
PHP 两个严重漏洞曝光,龙蜥社区 24 小时完成 3 版本修复
开发语言·操作系统·php·龙蜥社区
鱼宵11 小时前
Stream 终端操作一次讲透:collect、count、reduce 怎么选
java·stream·终端操作