Java构造器与工厂模式(静态工程方法)详解

  • 1. 构造器

    • 1.1 构造器的核心意义

      • 1.1.1  对象初始化

        • 构造器在创建对象 (new) 时自动调用, 用于初始化对象的状态 (如设置字段初始值, 分配资源等)
          • 无构造器时: 字段为默认值(0/null/false
          • 有构造器:确保对象创建后即处于有效状态

      • 1.1.2  强制初始化

        • 通过有参构造器强制要求调用方必须提供必要参数, 避免对象状态不完整 (如必须传入用户ID)。
      • 1.1.3  代码复用(重载机制)

        • 通过this()调用其他构造器,减少重复代码(构造器重载时)。
      • 1.1.4  封装控制(支持不可变的对象设计)

        • 私有构造器可限制对象创建 (单例模式, 工具类禁止实例化)
    • 1.2 构造器的基础语法

      • 代码示例
      • public class Car {private String brand;private int price;//无参构造public Car() {this.brand = "UNknow";this.price = 0;}//有参构造1public Car(String brand, int price) {this.brand = brand;this.price = price;}//有参构造2public Car(String brand) {this.brand = brand;}
        }
        
    • 1.3 构造器的关键特性

      • a. 命名: 必须与类名完全相同
      • b. 无返回值: 不可声名返回类型(连void都不行)
      • c. 自动调用: new 关键字自动调用
      • d. 默认构造器: 未显式定义构造器时编译器会自动生成一个无参构造器; 定义后则不会再生成
      • e. 支持重载: 可定义多个参数不同的构造器
    • 1.4 进阶用法

      • 1.4.1 构造器链

        • 使用 (this) 关键字调用本类其他构造器(必须放在第一行)
        • 代码示例:
        •  //有参构造1public Car(String brand, int price) {this.brand = brand;this.price = price;}//有参构造2public Car(String brand) {this(brand, 100000);//调用上面的双参构造器}
      • 1.4.2 父类构造器调用

        • 子类构造器必须调用父类构造器(显式或隐式) 使用  super(...) (必须第一行)
        • 1.4.2.1 可以不写 super() 的情况:
          • 父类存在无参构造器时 (显式定义或编译器自动生成), 子类构造器会隐式调用super() , 此时无需显式写出, 编译器会自动在第一行插入super()       
          • class Parent {// 编译器自动生成默认无参构造器:Parent() {}
            }class Child extends Parent {// 编译器自动添加:super();public Child() {System.out.println("Child构造器");}
            }
        • 1.4.2.2 必须写 super() 的情况 
          • a. 父类没有无参构造器
            • 若父类定义了有参构造器且未定义无参构造器时, 编译器不会生成默认无参构造器
            • 子类必须显式调用父类的某个带参构造器,否则编译报错。

          • b. 父类构造器有重载时需要明确指定
            • 若父类有多个构造器, 子类需要通过 super()  来选择调用哪一个
            • class ElectricCar extends Car{private int battery;public ElectricCar(String brand , int price , int battery){super(brand ,price);//先初始化父类(调用父类构造器)this.battery=battery;}
              }class GasCar extends Car{private int gas;public GasCar (String brand , int price , int gas){super(brand);this.gas=gas;}
              }
        • 1.4.2.3 特殊规则
          • 1. this() 和 super() 不能共存
            • a. 若子类构造器第一行用this(...)调用本类其他构造器,则不能再写super()
            • b. 被调用的本类构造器最终仍需调用super(...)
            • class GasCar extends Car {private int gas;public GasCar() {this(100);//// 调用GasCar类的其他构造器}public GasCar(int gas) {super("车车");}
              }
          • 2. 继承链的顶端是 Object
            • 所有类的终极父类是Object,其有无参构造器Object(),因此最顶层的super()调用总是安全的
      • 1.4.3 私有构造器应用场景

        • 1.4.3.1 单例模式: 全局唯一实例
          • public class Parents {private static final Parents Child = new Parents();//创建全局唯一实例private Parents(){// 私有构造器}public static Parents getInstance(){return Child;//返回唯一的实例}
            }
            
        • 1.4.3.2 工具类: 禁止实例化 (Math类等)
          • public class StringUtils {private StringUtils() {} // 防止 new StringUtils()public static boolean isEmpty(String s) { ... }
            }
      • 1.4.4 初始化顺序

        • 对象创建时的执行顺序:
        • 父类静态块 -> 子类静态块 -> 父类字段初始化 -> 父类构造器 -> 子类字段初始化 -> 子类构造器
    • 1.5 常见问题

      • Q: 为什么构造器不能有返回值?
        • ​​​​​​​A: 构造器隐含返回新对象,声明返回值会导致编译器将其视为普通方法。
      • Q: 构造器能被static/final修饰吗?
        • ​​​​​​​A: 不能! 构造器属于对象初始化机制,与类级别(static)和继承(final)无关。
      • Q: 子类如何调用父类带参构造器?
        • ​​​​​​​A: 通过super() 显式调用, 否则编译器会自动调用父类的无参构造器
  • 2. 静态工厂方法

  • s
  • s
  • s
  • s
  • s
  • s
  • s
  • s
  • s
  • s
  • s
  • s
  • s
  • s
  • s
  • s
  • s
  • s

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93005.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决jdk初始化运行,防火墙通信选错专业网络问题

问题描述新项目添加不同版本的jdk,运行时提示防火墙通信策略,选成专用网络。其他人访问后端接口时,提示连接失败。 解决方案:1、在搜索栏中输入 防火墙关键字,选择到防火墙和网络保护2、选择允许应用通过防火墙3、先点…

【Linux】常用命令(三)

【Linux】常用命令(三)1. export1.1 原理1.2 常用语法1.3 示例1.4 书中对命令的解释1.5 生效范围2. 测试服务地址与其端口能否访问2.1 nc(Netcat)命令2.2 telnet2.3 nmap2.4 curl命令 (适用于HTTP/HTTPS 服务)1. export export 是 Linux Shell&#xff…

Pytest项目_day15(yaml)

YAMLYAML是一个对所有编程语言都很友好的数据序列化标准,它是一种直观的能够被电脑识别的数据序列化格式,是一种可读性高且容易被人类阅读的脚本语言YAML语言的本质是一种通用的数据串行化格式适用场景 可以直接序列化为数组、字典解析成本低专门写配置文…

审批流程系统设计与实现:状态驱动、灵活扩展的企业级解决方案

审批流程系统设计与实现:状态驱动、灵活扩展的企业级解决方案 本文基于实际企业级审批系统源码,深入解析如何设计高扩展性、强一致性的审批流程引擎,涵盖状态机设计、多租户隔离、文件服务集成等核心实现。 1. 系统设计概览 审批系统的核心架…

汽车免拆诊断案例 | 2010款奥迪A4L车行驶中发动机偶尔自动熄火

故障现象 一辆2010款奥迪A4L车,搭载CDZ发动机 ,累计行驶里程约为18.2万km。该车行驶中发动机偶尔自动熄火,有时熄火后能够立即重新起动着机,有时需要等待一会儿才能重新起动着机,故障频率较低。因该故障在其他维修厂陆…

Liam ERD:自动生成美观的交互式实体关系图

Liam ERD 是一个可以快速生成美观且具有交互性的数据库实体关系图(ERD)的工具,可以帮助用户实现复杂数据库结构的可视化。 Liam ERD 是一个免费开源的项目,代码托管在 GitHub: https://github.com/liam-hq/liam 功能…

网络协议序列化工具Protobuf

目录前言一、下载注意二、解压安装三、Protobuf的使用1、创建.proto文件2、利用protoc编译.proto文件前言 Protocol Buffers是Google的⼀种语⾔⽆关、平台⽆关、可扩展的序列化结构数据的⽅法,它可⽤于(数据)通信协议、数据存储等。 Protoco…

从表单校验到API网关:全链路输入安全防护指南

从表单校验到 API 网关:全链路输入安全防护指南 在软件系统的安全防御体系中,输入安全是第一道防线,而这道防线的坚固程度直接决定了系统抵御外部攻击的能力。从用户在浏览器中填写表单的那一刻起,到数据经过 API 网关流转至后端服务,每一个环节都可能成为输入攻击的突破…

Flask vs Django:微框架与一站式对决

Flask 简介 1、简介 Flask诞生于2010年,是Armin ronacher用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架,又称之为微框架。 "微"的含义:Flask旨在保持核心简洁,本身相当于内核,其他功能需通过扩展…

真实业务场景:mysql慢查询优化(从17秒的查询优化到700毫秒)

慢查询业务场景:原先在我们系统中要统计一些人员的单位 部门信息的数据情况,比如总的男女人数,每个单位下的男女人数等等,然后原来的sql是这样写的 根据一个单位的id 然后对一张表做出多个子查询进行查询,这时候统计记录 由于加载…

远程影音访问:通过 cpolar 内网穿透服务使用 LibreTV

文章目录前言【视频教程】1.关于LibreTV2.docker部署LibreTV3.简单使用LibreTV4.安装cpolar内网穿透5.配置ward公网地址6.配置固定公网地址总结LibreTV 与 cpolar 的协同应用,为用户打造了一条通往高清观影自由的便捷之路。通过这一方案,用户不仅摆脱了商…

Apache ECharts 6 核心技术解密 – Vue3企业级可视化实战指南

简介 ECharts 是百度开源的一个使用 JavaScript 实现的开源可视化库,它能够生动、可交互地展示数据。在 Vue3 项目中集成 ECharts 可以让你的项目更加直观和动态地呈现数据信息。 核心优势 特性SVG渲染器Canvas渲染器缩放保真度★★★★★★★☆☆☆动态交互性能…

考公VS考研,拼哪个性价比高?

即将到来下半年,将迎来考公和考研是两个非常重要的考试,也是许多年轻人为之奋斗的目标。无论是获得一份稳定的“铁饭碗”,还是提升学历学位获得更高的竞争力,都是值得努力的方向。那么,考公vs考研,到底哪个…

python2操作neo4j

环境依赖 jdk、neo4j图数据库 操作一条数据完整demo import os,json,sys,io from py2neo import Graph,Nodetry:sys.stdout io.TextIOWrapper(sys.stdout.buffer, encodingutf-8)sys.stderr io.TextIOWrapper(sys.stderr.buffer, encodingutf-8) except Exception:passcla…

AI 编程实践:用 Trae 快速开发 HTML 贪吃蛇游戏

1. 背景与目标 贪吃蛇是最适合入门的 2D 网页小游戏之一:规则简单、反馈清晰、可扩展空间大(穿墙模式、道具、多食物、排行榜……)。 demo地址:https://game.haiyong.site/snake-game.html 本项目的目标是: 纯前端、…

FreeRTOS-C语言指针笔记

文章目录一级指针指针基本概念指针使用示例代码说明二、二级指针二级指针重点解析一级指针 C语言中的指针是一个非常重要的概念,它存储了变量的内存地址。指针的使用可以使程序更加高效,尤其在处理数组、字符串和动态内存分配时。 指针基本概念 指针变…

界面布局智能建议生成:从功能需求到专业UI的AI加速之路

内容简介: 传统界面设计让产品经理陷入"不懂设计、等设计师"的困境,效率低下还容易被挑刺。本文深度解析DeepSeek驱动的界面布局智能生成技术,通过DESIGN框架提示词模板,让产品经理在30分钟内生成3种专业级界面方案,实现…

【BLE系列-第三篇】数据链路层(LL):广播/连接/扫描流程详解

目录 引言 一、广播及连接建立 1.1 广播类型 1.2 扫描/连接请求与响应 1.2.1 广播流程说明 1.2.1.1 广播流程示例图 1.2.1.2 广播信息设置 1.2.1.3 信道广播 1.2.1.4 信道切换 1.2.1.5 广播间隔 1.2.1.6 接收窗口与理论最小传输时间 1.2.2 扫描/连接流程说明 1.2.…

JMeter 测试 WebSocket 接口的详细教程

1. 安装 WebSocket 插件 方法一:通过 Plugins Manager 下载并安装 JMeter Plugins Manager在 JMeter 中:Options → Plugins Manager搜索 WebSocket 并安装 方法二:手动安装 下载 jmeter-websocket-samplers 插件将 jar 文件放到 JMeter/…

飞算JavaAI智慧教育场景实践:从个性化学习到教学管理的全链路技术革新

目录一、智慧教育核心场景的技术突破1.1 个性化学习路径推荐系统1.1.1 学习者能力建模与评估1.2 智能教学管理系统1.2.1 自动化作业批改与学情分析1.3 教育资源智能管理系统1.3.1 教育资源智能标签与推荐二、智慧教育系统效能升级实践2.1 教育数据中台构建2.1.1 教育数据整合与…