Chapter 5 初始化与清理

Linux下fastai Chapter 2实战排障:DataBlock与CUDA深度优化 DataBlock是fastai构建数据流水线的核心抽象,其在Linux环境下的行为受文件系统权限、路径解析机制、多进程调度及CUDA内存管理等底层因素深刻影响。理解其依赖链——从Python的pathlib遍历、PIL图像解码,到torch DataLoader的fork子进程与cuMemAlloc显存分配——是解决FileNotFoundError、PermissionError和CUDA out of memory等问题的前提。Linux原生环境不隐藏系统细节,反而暴露了PyTorch、PIL、Ope 阅读详情

this 关键字

 

1)this 关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。

 

2)可以用this 调用一个构造器,但不能用相同的方法调用两个构造器。例如:

    Flower(int petals) {
        petalCount = petals;
        print("Constructor w/ int arg only, petalCount= "
                + petalCount);
    }

    Flower(String ss) {
        print("Constructor w/ String arg only, s = " + ss);
        s = ss;
    }

    Flower(String s, int petals) {
        this(petals);
        // ! this(s); // Can't call two!
        this.s = s; // Another use of "this"
        print("String & int args");
    }


除构造器之外,编译器禁止在其他任何方法中调用构造器。例如:

    void printPetalCount() {
        // ! this(11); // Not inside non-constructor!
        print("petalCount = " + petalCount + " s = " + s);
    }

 


构造器初始化 

 

1)在类的内部,变量定义的先后顺序决定了初始化的顺序。

 

2)static关键字不能应用于局部变量,它只能作用于域。

 

3)初始化的顺序是先“静态”,(如果它们尚未因前面的对象创建过程而被初始化),后“非静态”。

 

4)对象的创建过程会很有帮助。假设有个名为 Dog 的类:


1. 当首次创建类型为 Dog 的对象时(构造器可以看成静态方法),或者Dog 类的静态方法/静态域首次被访问时,Java 解释器必须查找类路径,以定位Dog.class 文件。


2. 然后载入 Dog.class(这将创建一个Class 对象),有关静态初始化的动作都会执行。因此,静态初始化只在Class 对象首次加载的时候进行一次。


3. 当用 new Dog( )创建对象的时候,首先将在堆上为Dog 对象分配足够的存储空间。


4. 这块存储空间会被清零,这就自动地将Dog 中的所有基本类型数据设置成了默认值(对数字来说就是0,对布尔型和字符型也相同),而引用则被设置成了null。


5. 执行所有出现于域定义处的初始化动作。


6. 执行构造器。这可能会牵涉到很多动作,尤其是涉及继承的时候。

 

数组初始化

 

1)编译器不允许你指定数组的大小。

 

2)数组的三种初始化方法,以及注意事项。

	/**
	 * 数组的三种初始化方式,数组在定义时不可以指定数组的大小
	 * */
	class ArrayTest {
		/**
		 * 第一种,在定义时进行初始化。 这种形式的初始化只可以在定义处使用。
		 * */
		Integer[] integer0 = { 1, 2, 3 };
		/**
		 * 第二种,在new对象时初始化。 这种形式的初始化不可以指定数组的大小
		 * */
		Integer[] integer1 = new Integer[] { 1, 2, 3 };
		/**
		 * 第三种,利用循环逐一初始化。 这种形式的初始化必须指定数组的大小。 在这种方式下,如果数组存储的数据类型是基本数据类型,
		 * 在数组通过new完成初始化后,所有的数组元素被初始化为该类型的默认值; 如果数组存储的是对象,则所有的数组元素被初始化为null。
		 * */
		Integer[] integer2 = new Integer[3];
		{

			for (int i = 0; i < integer2.length; i++) {
				integer2[i] = i;
			}
		}

	}


3)数组和可变参数列表

对于参数个数和参数类型 未知的场合,可以使用数组的第二种初始化方法来产生一个可变参数列表,例如:

class A {
}

public class VarArgs {
	static void printArray(Object[] args) {
		for (Object obj : args)
			System.out.print(obj + " ");
		System.out.println();
	}

	public static void main(String[] args) {
		printArray(new Object[] { new Integer(47), new Float(3.14),
				new Double(11.11) });
		printArray(new Object[] { "one", "two", "three" });
		printArray(new Object[] { new A(), new A(), new A() });
	}
} 


而在java5中,可以像下面这样定义可变参数列表:

class A {
}

public class NewVarArgs {
	static void printArray(Object... args) {
		for (Object obj : args)
			System.out.print(obj + " ");
		System.out.println();
	}

	public static void main(String[] args) {
		// Can take individual elements:
		printArray(new Integer(47), new Float(3.14), new Double(11.11));
		printArray(47, 3.14F, 11.11);
		printArray("one", "two", "three");
		printArray(new A(), new A(), new A());
		// Or an array:
		printArray(new Integer[] { 1, 2, 3, 4 });
		printArray(); // Empty list is OK
	}
}

有了可变参数列表,你就不用显示地编写 数组语法了,当你指定参数时,编译器会为你填充数组,你获取的仍旧是一个数组。注意程序的倒数第二行,可变参数列表也可以接受一个数组作为参数。

 

可变参数列表使得重载过程变得复杂:

public class OverloadingVarargs {
    static void f(Character... args) {
        System.out.print("first");
        for (Character c : args)
            System.out.print(" " + c);
        System.out.println();
    }

    static void f(Integer... args) {
        System.out.print("second");
        for (Integer i : args)
            System.out.print(" " + i);
        System.out.println();
    }

    static void f(Long... args) {
        System.out.println("third");
    }

    public static void main(String[] args) {
        f('a', 'b', 'c');
        f(1);
        f(2, 1);
        f(0);
        f(0L);
        // ! f(); // Won't compile -- ambiguous
    }
} 


在不使用参数调用f()时,编译器无法知道应该调用哪个方法。你可能会通过在某个方法中添加一个非可变参数来解决该问题:

public class OverloadingVarargs2 {
    static void f(float i, Character... args) {
        System.out.println("first");
    }

    static void f(Character... args) {
        System.out.print("second");
    }

    public static void main(String[] args) {
        f(1, 'a');
//         f('a', 'b'); //Won't compile -- ambiguous  
    }
}


如果你给这两个方法都添加一个非可变参数,就可以解决问题了:

public class OverloadingVarargs3 {
    static void f(float i, Character... args) {
        System.out.println("first");
    }

    static void f(char c, Character... args) {
        System.out.println("second");
    }

    public static void main(String[] args) {
        f(1, 'a');
        f('a', 'b');
    }
}


你应该总是只在重载方法的一个版本上使用可变参数列表,或者压根就不使用它。


 


Chapter 8 怎样使用类和对象(上篇) b:应在声明构造函数时默认值,而不能只在定义构造函数时指定默认值,因为类声明是放在头文件中,它是类的对外接口,用户是可以看到的,而函数的定义是类的实现细节,用户往往是看不到的。(2)静态局部对象在函数调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用static局部对象的析构函数。h:如果用户自己没有定义构造函数,系统会自动生成一个构造函数,只是这个构造函数的函数体是空的,也没有参数,不执行初始化操作。 阅读详情

相关推荐

用友U8接口开发全攻略:从EAI到OpenAPI的5种方式详解(附避坑指南)

本文深度解析了用友U8系统接口开发的五种核心方式:EAI、API、OpenAPI、SQL直连与内部CO组件。文章详细对比了各方式的适用场景、优缺点及实战操作,并提供了清晰的选型决策框架与避坑指南,帮助开发者根据具体业务需求选择最高效、最稳定的集成路径。

weixin_29322855的博客 682

Chapter5_初始化与清理_成员初始化

  在java中,成员初始化在使用之前应该都要保证已经完成初始化。对于在方法体中的局部变量,如果没有使用指定初始化的方法对成员变量进行初始化,编译器会提示一个错误。而对于类的数据成员,编译器会对这些成员赋予默认的初始值,下面这段代码反映了这一点。 1 package test1; 2 3 class InitialValue{ 4 public int i; 5 ...

weixin_33778778的博客 89

Halcon与C#联合编程(一):使用S7协议实现机器视觉上位机与西门子PLC联动

本项目技术栈:C#基础,多线程,Halcon DirectShow,Halcon形状检测,Halcon QR码识别,西门子S7通讯协议,西门子PLC为核心的下位机及执行元件

虎鲸不是鱼 1万+

Chapter5_初始化与清理_构造器初始化

一、构造器初始化的基本顺序   在使用构造器进行初始化时,最需要注意的是初始化的顺序,这种方法可以给初始化的顺序带来很大的灵活性。看如下的一个例子。 1 class Window{ 2 Window(int marker){ 3 System.out.println("Window(" + marker + ")"); 4 } 5 } ...

weixin_34223655的博客 104

Edge主页被2345劫持?手动清理注册表与组策略的完整方案

浏览器主页劫持是Windows系统中常见的恶意篡改行为,其原理是通过修改注册表、快捷方式、组策略等多处系统配置,强制锁定浏览器启动页。这类劫持不仅影响上网体验,还可能带来隐私泄露和恶意软件感染风险。在安全防护与系统优化场景中,掌握手动清理主页劫持的技能至关重要。本文针对Edge主页被2345导航劫持的问题,深入解析劫持入口,提供从快捷方式、注册表到组策略的逐层清理步骤,并给出防复发策略,帮助用户彻底摆脱顽固劫持。

weixin_30582943的博客 380

简单的服务器取证

记一次入门服务器取证——药品直销网,涵盖旧版本宝塔、静态IP的配置更改、代码的理解

m0_74559567的博客 3756

OOP丨《Java编程思想》阅读笔记Chapter 5 : 初始化与清理

Thinking In Java Chapter 5 read note

TheSumSt的经验站 909

人工智能训练师三级考试题型全解析|190道真题样例+30天备考路线

人工智能训练师三级考试并不神秘:理论考190道选择题(刷题就能过),实操考代码+方案设计(练练就会)。核心是花时间——30天系统备考,足以从容通过。如果你想从零开始系统备考,覆盖所有考点和实操技能,欢迎查看我的专栏:📖《人工智能训练师三级·从零到拿证完全指南》80篇系统化内容,覆盖报名、备考、冲刺、拿证全流程六大模块知识点逐个击破,每个考点都讲透实操代码题手把手教学,附带完整参考代码高频考点速记 + 易错题精讲 + 3套模拟试卷30天备考计划 + 冲刺复习策略。

白话机器学习 6062

Thinking In Java -- Chapter 5 -- 初始化与清理

方法重载: 区分重载方法的规则很简单,每个重载的方法都必须有一个独一无二的参数类型列表。参数顺序的不同,也足以区分两个方法,但是一般情况下别这么做,这样会使代码难以维护。 关于参数是基本类型(char,byte,short,int,long,float,double)的重载,如果传入的数据类型小于方法中声明的形式参数类型,实际数据类型就会被提升。char略有不同,如果无法找到恰好接受char参数的方法,就会把char直接提升到int型。如果传入的实际参数大于重载方法声明的形式参数,就得通过类型转化来执行

ljd781311726的博客 244

.Net如何使用Web API实现数据交互?

数据模型代表了要交互的数据结构。例如,假设我们要创建一个简单的图书管理系统,我们可以定义一个Book类作为数据模型。set;set;set;

Code365 257

面经-2023-哲库Zeku-数字芯片设计

面经-2023-哲库Zeku-数字芯片设计

w0shishabi的博客 3907

java编程思想 bruce Eckel chapter5 初始化与清理

5.1用构造器确保初始化 5.2方法重载 参数列表不同(个数,顺序,类型) 忽略返回值  5.3 默认构造器 5.4 this关键字 5.5清理:终结处理和垃圾回收 1.对象可能不被垃圾回收 2.垃圾回收并不等于"析构" 3.垃圾回收只与内存有关. 5.6成员初始化 5.7 构造器初始化 初始化顺序 静态数据的初始化 显式的静态初始化 非静态实例初始化 5.8 数组初

菜鸟码农成长记 268

即插即用系列(代码实践) | CVPR 2025 FDConv:频域动态卷积,打破密集预测任务的参数效率瓶颈

本文提取自 CVPR 2025 的最新底层算子革新论文《Frequency Dynamic Convolution for Dense Image Prediction》。近年来,动态卷积(Dynamic Convolution)通过融合多个并行卷积核极大地提升了模型性能,但研究表明:这些并行卷积核在频域上的响应高度相似,导致了极其严重的参数浪费,且缺乏对不同频率特征的自适应能力。本文复现了该网络的核心架构——FDConv(频率动态卷积)。该方案创造性地在傅里叶域(Fourier Domain)中学习固定参

分享顶会顶刊论文即插即用模块 111

Windows窗口拖不动?92%是组策略锁死而非卡顿

Windows窗口拖动失效是一种典型的UI交互异常现象,其本质并非硬件性能瓶颈或驱动兼容性问题,而是操作系统策略层对窗口消息循环(如WM_NCLBUTTONDOWN)的主动拦截。核心原理在于组策略(gpedit.msc)或注册表(NoSnapToEdge、NoDragDrop)对拖放行为的禁用机制,导致系统无法接收和分发移动意图。该问题具备明确的技术价值:避免误操作、增强桌面管控,常见于企业安全基线部署与第三方优化工具篡改场景。本文聚焦Windows本地组策略与注册表协同作用下的窗口管理机制,结合gpedi

weixin_33912638的博客 434

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Chapter5_初始化与清理_enum关键字

  enum关键字虽然只是一个很小的特性,但是它在我们使用枚举类型时,可以很方便的处理。先举一个例子。 1 enum Speciness{ 2 NOT, MILD, MEDIUM, HOT, FLAMING 3 } 4 5 public class test{ 6 public static void main(String args[]){ 7 ...

weixin_33919941的博客 122

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Chapter5_初始化与清理_数组初始化与可变参数列表

一、数组初始化   数组是相同类型的,用一个标识符名称封装到一起的一个对象序列或基本类型数据序列。编译器是不允许指定数组的长度的,当使用语句int[] a时,拥有的只是一个符号名,即一个数组的引用,并不拥有这个数组的存储空间。要获取数组的存储空间,必须要写初始化表达式,最朴素的表达式类型如下 1 int[] a = {1,2,3};   如果在编写程序时,不能确定数组的长度,可以使用如下...

weixin_34241036的博客 203

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Think in Java ---Chapter 5 初始化与清理

对象调用方法会隐式传递this指针,因此可以在方法内部使用this调用成员方法,也可以省略。参数列表的this会由编译器自动添加,方法内调用同类实例方法也会自动添加。 2.可以在方法中返回this指针,这样可以使用方法链调用。 3.传递this指针只在需要的时候,例如A需要一个修饰过的类B对象,则b.process()。在该方法中b把自己传递给另一个工具类c.(this)。 4.只能在构造方法中...

weixin_30802273的博客 146

Chapter5_初始化与清理_this关键字

  this关键字是Java中一类很特殊的关键字,首先它只能在方法内使用,用来表示调用这个方法的对象,在这一点上this和其他对对象的引用的操作是相同的。我们之所以可以在方法内部访问到它是因为编译器在方法调用时,会将调用方法的对象作为第一个参数传到方法里面。下面列举几个例子来对this的用途做一些总结。   (1)作为返回值,返回当前对象的引用,在一条语句里对同一个对象做多次操作。   ...

weixin_33755554的博客 104

Linux下fastai Chapter 3实战排障:CUDA、权限与混合精度故障修复

DataLoader是深度学习数据管道的核心组件,其在Linux系统中的行为受文件权限、CUDA上下文、多进程模型和数据类型一致性等底层机制深刻影响。理解PyTorch的显存分配策略、torch.cuda.is_available()的系统级判定逻辑,以及混合精度训练中float16与float32的dtype协同机制,是保障模型稳定训练的基础技术能力。这些原理在fastai框架的Chapter 3中集中暴露——尤其当ImageDataLoaders遭遇ulimit限制、Learner初始化受NVreg_R

dechen6073的博客 487

Chapter用户权限系统详解:5种角色权限配置与最佳实践

Chapter是一款专为非营利组织设计的自托管活动管理工具,其**用户权限系统**采用精细化的三级权限控制模型,确保组织能够安全、高效地管理各类活动。在本文中,我们将深入解析Chapter的**5种核心角色权限配置**,并分享实用的**最佳实践指南**,帮助您快速上手这一强大的活动管理平台。 ## 📊 Chapter权限系统架构概览 Chapter的权限系统采用三级架构设计,从全局到局部层层

gitblog_00049的博客 1175

Java编程思想总结笔记Chapter 5

初始化和清理是涉及安全的两个问题。本章简单的介绍“垃圾回收器”及初始化知识。 第五章 初始化与清理 目录:5.1 用构造器确保初始化5.2 方法重载5.3 默认构造器5.4 this关键字5.5 清理:终结处理和垃圾回收5.6 成员初始化5.7 构造器初始化5.8 数组初始化化5.9 枚举类型5.10 总结 5.2 方法重载 方法重载是指在一个类中定义多个同名的方法(注意...

weixin_30824599的博客 99

Thinking in Java,Chapter 5,阅读笔记

Java中的finalize()方法 参考链接: https://blog.youkuaiyun.com/Justin_zhao/article/details/74358828 垃圾回收 -Java的垃圾回收器只会释放由我们new出来的内存堆块,那些不是由new出来的“特殊内存”,垃圾回收器是不会管理的。 -所谓的特殊内存指通过JNI用C/C++向系统申请的内存,这些内存如果不手动去清除就会一直占据在内...

wjl960827的博客 310

《Thinking in Java》 Chapter 5 Tips

5.1 用构造器保证初始化 构造器采用与类相同的名称。构造器是一种特殊类型的方法,因为它没有返回值 当创建一个对象时,也就是给此对象分配到的存储空间起了一个名字 5.2 方法重载 为了让方法名相同而形式参数不同的构造器同时存在,必须使用方法重载。每个重载的方法都必须有一个独一无二的参数类型列表 基本类型能从一个“较小”的类型自动提升至一...

weixin_33991418的博客 101

thinking in java 5,Thinking In Java 阅读笔记 Chapter5

C++ 引入了构造器的概念,这是一个在创建对象时被自动调用的特殊方法。Java也采用了构造器,并且额外提供了垃圾回收器。1 用构造器确保初始化构造器是与对象同名的方法,在使用 new 创建对象时,默认执行对象的无参构造方法执行初始化。2 方法重载以构造方法为例,有参构造方法即为重载的构造方法,即同名的方法是方法重载的必要条件。2.1 区分重载方法重载方法名称相同,参数列表不同,定义时参数顺序最好有...

weixin_29051149的博客 225

Think in Java 笔记(chapter1-7)

Content   Chapter 1:对象导论   Chapter 2:一切都是对象   Chapter 3:操作符   Chapter 4:控制执行流程   Chapter 5:初始化与清理   Chapter 6:访问权限控制   Chapter 7:复用类 Chapter 1:对象导论 1.1 抽象过程   将问题空间中的元素及其在解空间中...

dducsnpbb77257296的博客 318

chapter 5 使用Item Pipeline处理数据

第5章 使用Item Pipeline处理数据    在之前的章节中,我们学习了提取数据以及封装数据的方法,这一章来学习如何对爬取到的数据进行处理。在Scrapy中,Item Pipeline是处理数据的组件,一个Item Pipeline就是一个包含特定接口的类,通常只负责一种功能的数据处理,在一个项目中可以同时启用多个Item Pipeline,它们按指定次序级联起来,形成一条数据处理流水线。    以下是Item Pipeline的几种典型应用: ● 清洗数据。 ● 验证数据的有效性。 ● 过滤掉重复

lee's的博客 801
上一篇: Chapter 3 操作符
下一篇: Chapter 6 访问权限控制
堕落的天使
博客等级 码龄18年 140粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值