Java类的默认构造函数
什么情况下存在默认构造函数
说明
如果一个Java类没有显式包含构造函数的声明,那么隐含着有一个默认构造函数。
示例
定义一个类B,没有显式声明构造函数,所以存在一个默认构造函数:
package com.thb;public class B {public void method() {}
}
定义一个类C,显式声明了一个带参数的构造函数,所以就不存在默认构造函数:
package com.thb;public class C {private String msg;public C(String msg) {this.msg = msg;}public void method() {}
}
定义一个类Test1 ,调用类B和类C:
package com.thb;public class Test1 {public static void main(String[] args) {// 类B没有声明构造函数,所以会隐含着有一个默认构造函数B b = new B();b.method();// 如果去掉下面代码前面的注释就会编译出错,因为类C中已经明确声明了一个带参数的构造// 函数,就不会有默认构造函数了// C c = new C(); C c = new C("hello"); // 调用类C声明的构造函数c.method(); }
默认构造函数的形式
一个顶层类、成员类、局部类的默认构造函数形式如下:
默认构造函数的访问修饰符
说明
默认构造函数的访问修饰符和类的访问修饰符相同;如果类没有显式声明访问修饰符,那么默认构造函数是包的访问修饰符。
示例—类用public修饰
定一个类B,用public修饰,没有声明构造函数,所以存在一个默认构造函数:
package com.thb;public class B {public void method() {}
}
打开类B编译后的class文件,可以发现,因为类B的访问控制修饰符是public,所以默认构造函数的访问控制修饰符也是public:
// Compiled from B.java (version 18 : 62.0, super bit)
public class com.thb.B {// Method descriptor #6 ()V// Stack: 1, Locals: 1public B();0 aload_0 [this]1 invokespecial java.lang.Object() [8]4 returnLine numbers:[pc: 0, line: 3]Local variable table:[pc: 0, pc: 5] local: this index: 0 type: com.thb.B// Method descriptor #6 ()V// Stack: 0, Locals: 1public void method();0 returnLine numbers:[pc: 0, line: 5]Local variable table:[pc: 0, pc: 1] local: this index: 0 type: com.thb.B
}
示例—类没有显式声明访问控制修饰符
定义类D,没有显式声明访问控制修饰符,即表示是包访问控制:
package com.thb;class D {}
打开类D编译后的class文件,可以发现,默认构造函数也没有注明访问控制修饰符,即是包访问控制:
// Compiled from D.java (version 18 : 62.0, super bit)
class com.thb.D {// Method descriptor #6 ()V// Stack: 1, Locals: 1D();0 aload_0 [this]1 invokespecial java.lang.Object() [8]4 returnLine numbers:[pc: 0, line: 3]Local variable table:[pc: 0, pc: 5] local: this index: 0 type: com.thb.D
}
默认构造函数没有形式参数(非private的内部成员类除外)
说明
默认构造函数没有形式参数,非private的内部成员类除外。
非private的内部成员类的默认构造函数有一个形式参数,这个形式参数类型是包裹内部成员类的外部类。
示例:非private的内部成员类的默认构造函数
定义一个类E,在其内部定义一个非private的成员类AnotherInE :
package com.thb;public class E {class AnotherInE {}
}
打开类E 编译后的class文件,可以发现它有一个没有形式参数的默认构造函数:
// Compiled from E.java (version 18 : 62.0, super bit)
public class com.thb.E {// Method descriptor #6 ()V// Stack: 1, Locals: 1public E();0 aload_0 [this]1 invokespecial java.lang.Object() [8]4 returnLine numbers:[pc: 0, line: 3]Local variable table:[pc: 0, pc: 5] local: this index: 0 type: com.thb.EInner classes:[inner class info: #17 com/thb/E$AnotherInE, outer class info: #1 com/thb/Einner name: #19 AnotherInE, accessflags: 0 default]Nest Members:#17 com/thb/E$AnotherInE
}
打开内部类AnotherInE 编译后的class文件,可以发现内部成员类的默认构造函数有一个形式参数,类型是包裹它的类E:
// Compiled from E.java (version 18 : 62.0, super bit)
class com.thb.E$AnotherInE {// Field descriptor #6 Lcom/thb/E;final synthetic com.thb.E this$0;// Method descriptor #8 (Lcom/thb/E;)V// Stack: 2, Locals: 2E$AnotherInE(com.thb.E arg0);0 aload_0 [this]1 aload_1 [arg0]2 putfield com.thb.E$AnotherInE.this$0 : com.thb.E [10]5 aload_0 [this]6 invokespecial java.lang.Object() [12]9 returnLine numbers:[pc: 0, line: 5]Local variable table:[pc: 0, pc: 10] local: this index: 0 type: com.thb.E.AnotherInEInner classes:[inner class info: #1 com/thb/E$AnotherInE, outer class info: #22 com/thb/Einner name: #24 AnotherInE, accessflags: 0 default]Nest Host: #22 com/thb/E
}
默认构造函数没有throws 子句
默认构造函数体的内容
说明
如果声明的是基本类Object,那么默认构造函数体是空的。如果声明的是其它的类,在默认构造函数体内调用父类的没有形式参数的构造函数。
示例----在子类的默认构造函数体内调用父类的没有形式参数的构造函数
定义类B:
package com.thb;public class B {public void method() {}
}
定义B的子类BB:
package com.thb;public class BB extends B {}
打开类BB编译后的class文件,可以发现它的默认构造函数体内调用父类B的没有形式参数的构造函数:
// Compiled from BB.java (version 18 : 62.0, super bit)
public class com.thb.BB extends com.thb.B {// Method descriptor #6 ()V// Stack: 1, Locals: 1public BB();0 aload_0 [this]1 invokespecial com.thb.B() [8]4 returnLine numbers:[pc: 0, line: 3]Local variable table:[pc: 0, pc: 5] local: this index: 0 type: com.thb.BB
}
编译出错示例—子类没有显式定义造函数,但父类没有这样一个构造函数:无形式参数并且无throws 子句
定义一个类B,显式定义了一个带形式参数的构造函数,但没有定义无形式参数且没有throws 子句的构造函数:
package com.thb;public class B {private String name;public B(String name) {this.name = name;}public void method() {}
}
定义类B的子类BB,BB中没有显式定义构造函数,编译出错:


相关文章:
Java类的默认构造函数
什么情况下存在默认构造函数 说明 如果一个Java类没有显式包含构造函数的声明,那么隐含着有一个默认构造函数。 示例 定义一个类B,没有显式声明构造函数,所以存在一个默认构造函数: package com.thb;public class B {public …...
华为openGauss数据库入门 - gsql用法
目录 1.1 gsql的语法 1.2 gsql常用选项 1.2.1 最常用的必要选项 1.2.2 -r选项 1.2.3 -E选项 1.2.4 -t选项 1.2.5 -A选项 1.2.6 -v选项 1.2.7 -c选项 1.2.8 -f选项 1.2.9 -q选项 1.3 gsql的元命令 1.3.1 \l命令 1.3.2 \du命令和\dg命令 1.3.3 \db命令 1.3.4 \d…...
The Sandbox 重新上线,带来全新体验!
在经历了一个充满史诗般新回忆的全力开局后,我们短暂休息了片刻,为玩家准备了全新的、惊心动魄的游戏活动。 我们已经完成了功能的微调,准备将您的游戏体验提升到一个全新高度! 想知道我们正在做什么吗?现在还无法公开…...
动态内存管理面试题
动态内存管理面试题 文章目录 动态内存管理面试题一、第一题此代码存在的问题运行结果分析原因修改 二、第二题此代码存在的问题运行结果分析原因修改 一、第一题 代码如下(示例): #include<stdio.h> #include<string.h> #incl…...
树莓派外设开发编程
目录 一、树莓派的接口:驱动 二、wiringPi 库 1.在使用wiringPi库的时候,需要包含头文件 2.wiringPi库API 一、树莓派的接口:驱动 IO口:input output 对于主控来说 Input :人体、烟雾、振动 output: 继电…...
Java从入门到精通(一)
Java从入门到精通(一) 前言 温故而知新,闲着没事干,准备将Java编程语言的知识点从头梳理一遍,整理成笔记,逐篇发布。 部分图片素材来源与B站“黑马程序员”的课程。 一 Java背景 Java是1995年 由Sun公司…...
Electron从构建到打包程exe应用
Electron从构建到打包程exe应用 Electron文档搭建网页装载到 BrowserWindow中定义全局对象进程之间通信渲染器进程到主进程(单向)渲染器进程到主进程(双向)主进程到渲染器进程 打开调试器打包应用程序对代码进行签名 Electron文档…...
3分钟学会设计模式 -- 单例模式
►单例模式 ►使用场景 在编写软件时,对于某些类来说,只有一个实例很重要。例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统中可以多次查询数据库,但是只需要一个连接&#x…...
《面试1v1》Kafka与传统消息系统区别
🍅 作者简介:王哥,CSDN2022博客总榜Top100🏆、博客专家💪 🍅 技术交流:定期更新Java硬核干货,不定期送书活动 🍅 王哥多年工作总结:Java学习路线总结…...
【算法第十三天7.27】平衡二叉树,二叉树所有路径,左叶子之和
链接力扣110-平衡二叉树 思路 1、左右子树高度差不超过1 2、左子树、右子树均为平衡二叉树 3、需要获得树高,如果不是平衡的就返回-1;如果是平衡,就返回对应的高 class Solution {public boolean isBalanced(TreeNode root) {return getH…...
arm架构cloudstack的agent报错No more available PCI slots如何解决
当ARM架构的CloudStack代理报错"No more available PCI slots"时,这通常表示ARM实例已用尽可用的PCI插槽。PCI插槽用于连接网络接口卡(NIC)和其他扩展设备到虚拟机实例。 解决此问题的方法可以考虑以下几点: 调整实例的…...
day43-Feedback Ui Design(反馈ui设计)
50 天学习 50 个项目 - HTMLCSS and JavaScript day43-Feedback Ui Design(反馈ui设计) 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport&q…...
TypeScript基础篇 - TS日常类型 上篇
目录 TS的常见用法介绍 example01.ts 逃避类型检查:any 思考一下~:不知道类型 类型标注 函数(参数和返回值) 匿名函数 TS如何知道匿名函数的类型? TS是一种标注式语言,不侵入JS的设计 TS的常见用法…...
量化交易——python数据分析及可视化
该项目分为两个部分:一是数据计算,二是可视化,三是MACD策略 一、计算MACD 1、数据部分 数据来源:tushare 数据字段包含:日期,开盘价,收盘价,最低价,最高价,…...
微服务网关
1.网关是如何演化来的,在微服务中有什么作用? 随着单体架构转化为微服务架构的时候,由一个后台服务由一个单一的服务变成了多个微服务,前端应用需要调用多个服务的接口,为了解决这个问题,网关就产生了。网…...
【打卡】Datawhale暑期实训ML赛事
文章目录 赛题描述任务要求数据集介绍评估指标 赛题分析基于LightGBM模型Baseline详解改进baseline早停法添加特征 赛题描述 赛事地址:科大讯飞锂离子电池生产参数调控及生产温度预测挑战赛 任务要求 初赛任务:初赛提供了电炉17个温区的实际生产数据&…...
【python脚本】python实现:目标检测裁剪图片样本,根据类标签文件进行裁剪保存
python实现:目标检测裁剪图片样本,根据类标签文件进行裁剪保存 我在进行目标检测时候,比如红绿灯检测,目标区域很小,样本杂乱。 想要筛选错误样本的话,很困难。可以把目标区域裁剪出来。人大脑处理对于这…...
Mac 终端美化显示
Linux 也可安装 Zsh 后使用此套配置。 1. 安装 Oh My Zsh sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"2. 更换主题,修改文件:~/.zshrc,原内容: ZSH_THEME&quo…...
信息安全:密码学基本理论.
信息安全:密码学基本理论. 密码学是研究编制密码和破译密码的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学. 目录…...
【linux升级ssh】 利用rpmbuild工具对ssh打包为rpm包进场安装升级
制作rpm包 rpmbuild命令用于创建软件的二进制包和源代码包。 官方文档:rpm.org - RPM Reference Manual rpmbuild 中文手册:rpmbuild 中文手册 [金步国] 使用rpmbuild将tar包打成rpm包 RPM打包使用的是rpmbuild命令,这个命令来自rpm-buil…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
