【Java核心技术13】Java中的构造器与析构器:深入解析与代码示例

news2024/11/17 19:49:02

引言

所有文章均为原创验证,您随手的 关注点赞收藏 是我创作最大的动力。
示例代码地址:https://gitee.com/code-in-java/csdn-blog.git

在面向对象编程语言中,构造器和析构器是类生命周期管理的关键部分。构造器负责初始化新创建的对象,而析构器则负责清理不再使用的对象。然而,在Java中,析构器的概念与C++等其他语言有所不同。

本文将深入探讨Java中的构造器,以及它如何替代传统意义上的析构器——垃圾回收机制。

一、Java中的构造器

  • 构造器是一种特殊的方法,用于初始化一个新创建的对象。
  • 每个类都可以有一个或多个构造器,但至少需要一个默认构造器。
  • 构造器的名称与类名相同,没有返回类型,并且不能被static、final、abstract 或 native 修饰。
  • 构造器有两种类型:默认构造器和自定义构造器。当类中没有定义任何构造器时,Java编译器会自动提供一个无参的默认构造器。如果类中定义了任何构造器,即使它们都是无参的,编译器也不会再提供默认构造器。

1. 代码示例:


public class Person {
    private String name;
    private int age;

    // 默认构造器
    public Person() {
        this.name = "默认构等器";
        this.age = 20;
    }

    // 自定义构造器
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

	 //打印结果
	public static void main(String[] args) {
	    Person person1 = new Person(); // 使用默认构造器
	    System.out.println("我是:" + person1.name + ", 年龄:" + person1.age);
	
	    Person person2 = new Person("自定义构造器", 35); // 使用自定义构造器
	    System.out.println("我是:" +person2.name + ", 年龄:" + person2.age);
	}
}

2. 执行结果:

在这里插入图片描述

二、Java中的析构器——垃圾回收

在C++等语言中,析构器是用于在对象销毁前执行清理工作的特殊方法。然而,在Java中,并没有直接的析构器概念。Java使用垃圾回收机制来 自动管理内存,因此通常不需要程序员手动释放资源。不过,有时我们可能需要在对象被垃圾回收前执行一些特定的清理操作,比如 关闭文件句柄断开数据库连接 等。为此,Java提供了一个名为 finalize() 的方法,它会在对象被垃圾回收器回收之前被调用。

需要注意的是,finalize() 方法的使用在现代Java编程中并 不推荐,因为它不是确定性的(即你不能保证它何时会被调用),且可能会影响垃圾回收的性能。更好的做法是使用 try-with-resources 语句或显式地关闭资源。

1. 代码示例:

public class Resource {
    private final String resourceName;

    public Resource(String resourceName) {
        this.resourceName = resourceName;
        System.out.println("Resource created: " + resourceName);
    }

    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("Resource finalized: " + resourceName);
    }

    public static void main(String[] args) {
        Resource resource = new Resource("MyResource");
        resource = null; // 使对象置空
        System.gc(); // 请求垃圾回收
    }
}

在上述代码中,我们创建了一个 Resource 对象,并在 main 方法中使其置空。然后我们请求垃圾回收,但请注意,垃圾回收的具体时间是不确定的,因此 finalize() 方法的调用也不确定。

结束语:

Java中的 构造器 是初始化对象的关键,而 析构器 的概念则由垃圾回收机制替代。了解这些概念对于有效地使用Java进行面向对象编程至关重要。尽管 finalize() 方法存在,但在现代Java开发中,我们应该避免依赖它,而是采用诸如 try-with-resources 等更安全、更高效的方法来管理资源。

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

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

相关文章

Java NIO(一) 概述

NIO主要用于以少量线程来管理多个网络连接,处理其上的读写等事件。在大量连接情况下,不管是效率还是空间占用都要优于传统的BIO。 Java NIO 由以下几个核心部分组成: Channel Buffer Selector Selector 如果你的应用打开了多个连接&#x…

Hack The Box-Axlle【更新中】

总体思路 XLL-EXEC->hta反弹shell->重置用户密码->重写二进制文件 信息收集&端口利用 nmap -sSVC axlle.htb开放了一大堆端口,这里先挑重点的80端口和445端口查看 80端口主页只有一个邮箱账号,对其目录扫描和子域名扫描 dirsearch -u h…

Python统计实战:3D散点图绘制

为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能,从而更快地掌握解决问题所需的能力。 (以下练习题来源于《统计学—基于Python》。联系获取完整数据和Python源代码文件。) 练习题 用以下数…

【力扣】从前序与中序遍历序列构造二叉树

🔥博客主页: 我要成为C领域大神 🎥系列专栏:【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于分享知识,欢迎大家共同学习和交流。 给定两个整数数…

测评:【ONLYOFFICE】版本更迭与AI加持下的最新ONLYOFFICE桌面编辑器8.1

你是否还在为没有一款合适的在线桌面编辑器而苦恼?你是否还在因为办公软件的选择过少而只能使用WPS或者office?随着办公需求的不断变化和发展,办公软件也在不断更新和改进。ONLYOFFICE 作为一款全功能办公软件,一直致力于为用户提…

视图(views)

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 下面通过一个例子讲解在Django项目中定义视图,代码如下: from django.http import HttpResponse # 导入响应对象 impo…

android-aidl4

转:Android Aidl的使用_android aidl使用-CSDN博客 一.准备 Parcelable,可以理解成只是把car整个对象在aidl中进行传递,就理解成一个car的一个类吧,和其他类使用一样就行了,回调:把接口作为参数放在函数参…

Mysql: SQL-DDL

一.SQL通用语法 1.SQL可以单行或者多行书写,以分号结尾。 2.SQL语句可以使用空格/缩进来增强语句的可读性。 3.MySQL数据库的SQL语句不区分大小写,关键字建议用大写。 4.注释: 单行注释:注释内容或#注释内容(Mysql特有) 多行注释:/*注释内容*/ 二.SQL分类 1.D…

常用MQ消息中间件Kafka、ZeroMQ和RabbitMQ对比及RabbitMQ详解

1、概述 在现代的分布式系统和实时数据处理领域,消息中间件扮演着关键的角色,用于解决应用程序之间的通信和数据传递的挑战。在众多的消息中间件解决方案中,Kafka、ZeroMQ和RabbitMQ 是备受关注和广泛应用的代表性系统。它们各自具有独特的特…

Msql----表的约束

提示:以下是本篇文章正文内容,下面案例可供参考 一、表的约束 表的约束:表中一定要有约束,通过约束让插入表中的数据是符合预期的。它的本质是通过技术手段,让程序员插入正确的数据,约束的最终目标是保证…

AVL树插入详解

1.什么是AVL树 二叉搜索树可以提高搜索的效率,但是如果数据有序或者接近有序,就会退化为单边树,查找效率相当于在顺序表中查找数据,时间复杂度会退化到O(n)。AVL树解决了这个问题,通过保证每个节点的左右子树高度之差…

BoosterX:专为游戏爱好者打造的终极 Windows 系统优化工具

《黑神话:悟空》、《艾尔登法环:黄金树幽影》、暴雪「全家桶」回归……下半年,我们将迎来一场豪华的游戏大餐! 想要畅玩游戏,除了要准备好给力的硬件设备,系统优化当然也不能落下! BoosterX 正…

C++在VS2022开发Windows窗口程序1:第一个win窗口程序

Windows操作系统是由微软公司开发和维护的一系列图形化操作系统的统称。Windows操作系统主要用于个人计算机、笔记本电脑、平板电脑、服务器等设备上。Windows起源于Microsoft-DOS模拟环境,相比于DOS的指令化模式,Windows采用图形化的模式,因…

微信小程序 引入MiniProgram Design失败

这tm MiniProgramDesign 是我用过最垃圾的框架没有之一 我按照官网的指示安装居然能安装不成功,牛! 这里说明我是用js开发的 到以上步骤没有报错什么都没有,然后在引入组件的时候报错 Component is not found in path “./miniprogram _npm/vant/weapp/button/index” (using…

SAPUI5基础知识9 - JSON Module与数据绑定

1. 背景 在前面的博客中,我们已经学习了SAPUI5中视图和控制器的使用,在本篇博客中,让我们学习下MVC架构中的M-模型了。 SAPUI5中的JSON Model是一个客户端模型,可以用于在SAPUI5应用程序中处理和操作JSON数据。SAPUI5提供了绑定…

prometheus+grafana搭建监控系统

1.prometheus服务端安装 1.1下载包 使用wget下载 (也可以直接去官网下载包Download | Prometheus) wget https://github.com/prometheus/prometheus/releases/download/v2.44.0/prometheus-2.44.0.linux-amd64.tar.gz1.2解压 tar xf prometheus-2.44…

Flutter ffi Failed to lookup symbol

iOS release版本,解决方式参考官方文档:在 iOS 中使用 dart:ffi 调用本地代码 如果debug版本也报这个错误,很可能是有多个.c文件,编译的时候没带上! 假设你的ffi模块名字是 c_lib 对于Android端,需要修改…

03-Shell编程之循环语句与函数

目录 3.1 for循环语句 3.1.1for语句的结构 3.1.2 for语句应用实例 3.2 使用whlie循环语句 1.打印数字1到5 3.3 使用until循环语句 3.3.1until的实例 1.打印数字1到5(使用until的逆向逻辑) 2.等待用户输入特定内容 3.4 函数 3.4.1Shell函数的基…

你还在手动操作仓库?这款 CLI 工具让你效率飙升300%!

前言 作为一名开发者,我经常会在 GitHub 和 Gitee 上 fork 各种项目。时间一长,这些仓库就会堆积如山,变成了“垃圾仓库”。每次打开代码托管平台,看到那些不再需要的仓库,我的强迫症就会发作。手动一个一个删除这些仓…

仿微信图片查看器`WPF`实现`ListBox` 鼠标滑动批量选中与反选效果

看到微信中,上传图片时的图片查看功能可以通过手指长按并滑动实现多选,于是为解析实现思路,也通过WPF 使用ListBox 实现了一版案例。 参考效果 微信效果如下,支持图片单选和鼠标长按滑动实现批量操作。 WPF模仿效果&#xff1a…