<Java编程思想> 初始化与清理

nature子刊:MCNN基于电池故障诊断的模型约束的深度学习方法 本研究提出了一种基于模型约束神经网络(MCNN)的锂离子电池在线故障诊断方法,整合物理模型与深度学习,有效解决了随机工况下传统方法诊断精度低、依赖故障样本等问题。通过统计修正电池包模型和双向LSTM网络,实现了电池状态的高精度预测(平均RMSE 3.9%),并设计模型耦合自动编码器提取可解释特征。在包含18.2百万条真实车辆数据的验证中,该方法故障检测TPR在FPR=0.1时达85%,较基准方法提升超46.5%,且能提前30分钟预警内部短路等故障。研究还展示了算法在跨电池包结构迁移中的优越性,为工业应用提供 阅读详情

1、静态初始化只有在必要的时刻才会进行。

静态初始化比如:static的变量成员,或者是一段跟在static关键字后面的代码。

public class Spoon{
  static int i;
  static{
    i = 47;
  }
}
这两种情况仅仅执行一次:当首次生成这个类的一个对象时,或者首次访问属于那个类的静态数据成员时(即使从未生成过那个类的对象)。
2、数组初始化

定义一个数组有两种写法:int [] a1   或者是 int a1[]

《Java编程思想》里面说到“编译器不允许指定数组的大小”,我认为这里是翻译错误了:Java的内存分配原则是先在堆栈建立一个变量的引用(可以理解为指针),也就是说无论我们用int[] a1还是int a1[],我们拥有的都只是对数组的引用,而数组真正的数组对象是在堆上面的对象。所以给数组以相应的存储空间,就必须写初始化表达式,初始化表达式应该是对数组对象进行操作而不是对引用进行操作。这与C++有很大的不同。

对于数组,初始化动作可以出现在代码的任何地方。但是也可以使用一种特殊的初始化表达式。类似:

int[] a1 = {1,2,3,4,5};

这种情况下存储空间的分配(等价于使用new关键字)将由编译器负责。


===========番外============

public class ArraysOfPrimitives{
   public static void main(String[] args){
     int[] a1 = {1,2,3,4,5};
     int[] a2 ;
     a2 = a1;
     for(int i = 0; i < a2.length;i++)
        a2[i] = a2[i] + 1;
     for(int i = 0; i < a1.length; i++)
        System.out.println(a[i]);
   }
}

这里面a2是新建的一个句柄。并没有为a2分配一个新的对象而只是将a2指向了a1已经指向的数组对象。所以运行结果为2 3 4 5 6

==========================

此外数组的另一种初始化方式是使用new关键字。这适用于我们并不知道具体会有多少个元素以及各个元素是什么,但是我们可以知道一个元素数量的上标。比如:

import java.util.*;
public class ArrayNew{
    public static void main(String[] args){
    	int[] a;
    	a = new int[100];//尽量int[] a = new int[100];
    	System.out.println(a.length);
    	System.out.println(Arrays.toString(a));
    }
}

通过这个小例子我们可以发现,使用new关键字为数组进行初始化是可行的。此外:Arrays.toString()方法属于java.util标准类库,它将产生一维数组的可打印版本。

紧接着我们来比较一下原始类型和封装类型在数组初始化的时候会有什么不同。定义代码如下:

import java.util.*;
public class ArrayNew{
    public static void main(String[] args){
    	int[] a = new int[10];
		System.out.println(a[3]);
    	//System.out.println(a.length);
    	//System.out.println(Arrays.toString(a));
    }
}
输出当然为0.
把上面的int改为Integer则输出为null.



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()
	   });
   }
}
47 3.14 11.11 
one two three 
A@f39b3a A@1542a75 A@af993e 默认行为下,如果没有定义toString()方法,则是打印类的名字和对象的地址。

printArray(new Object[]{
			   34,new Float(3.14),new Double(11.11)
	   });
也能正确编译运行。

在Java SE5新引入的可变参数的特性。我们可以实现下面的代码:

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 Integer(47),new Float(3.14),new Double(11.11));
		printArray(47,3.14F,11.11D);
		printArray(new A(),new A(),new A());
		printArray((Object[])new Integer[]{1,2,3,4});
		printArray();
	}
}
47 3.14 11.11 
47 3.14 11.11 
A@160a26f A@1484a05 A@f39b3a 
1 2 3 4 

有了可变参数,就再也不用显式地编写数组语法了,当你指定参数时,编译器实际上会为你去填充数组。你获取的仍旧是一个数组,这就是为什么print()可以使用foreach来迭代该数组的原因。但是,这不仅仅只是从元素列表到数组的自动转换,就像Integer数组被转型为一个Object数组并传递给了printArray方法,很明显,编译器会发现它已经是一个数组了,所以不会在其上执行任何转换。因此,如果你有一组事物,可以把它们当做列表传递,而如果你已经有了一个数组,该方法可以把它们当做可变参数列表来接受。
真的是可变的噢:

class A{}
public class VarArgs{
	static void printArray(Object ... args){
		System.out.println(args.length);
		for(Object obj : args)
			System.out.print(obj + " ");
		System.out.println();
	}
	public static void main(String[] args){
		printArray(new Integer(47),new Float(3.14),new Double(11.11));
		printArray(47,3.14F,11.11D);
		printArray(new A(),new A(),new A());
		printArray((Object[])new Integer[]{1,2,3,4});
		printArray();
	}
}
3
47 3.14 11.11 
3
47 3.14 11.11 
3
A@160a26f A@1484a05 A@f39b3a 
4
1 2 3 4 
0

ZLMediaKit在Windows下启用WebRtc编译(64位) 准备软件 cmake-gui vs2017 已经编译好的windows版本openssl(下载地址) 当然,你完全可以自己按照openssl的官网教程自己编译windows版本的openssl libsrtp编译安装 首先,需要将下载好的openssl解压并添加到环境变量。如下图,将下图路径添加到环境变量 其次,下载libsrtp(下载地址) 下载后解压并新建build文件夹,如下图: 在合适位置新建文件夹放置install后的srtp文件,如"D:\develop20.. 阅读详情

相关推荐

使用GitLab+Drone CI持续集成自动部署web项目,图文详细

kind: pipeline # 定义对象类型,还有secret和signature两种类型 type: docker # 定义流水线类型,还有kubernetes、exec、ssh等类型 name: mall-tiny-drone # 定义流水线名称 steps: # 定义流水线执行步骤,这些步骤将顺序执行 - name: package # 流水线名称 image: maven:3-jdk-8 # 定义创建容器的Docker镜像 volumes: # 将容器内目录挂载到宿主机,仓库

4105

Day16-51.Array initialization

数组初始化 数组只是相同类型的,用一个标识符名称封装到一起的一个对象序列或基本类型数据序列。 数组是通过方括号下表操作符[]来定义和使用的。 要定义一个数组,只需在类型名后加上一对方括号即可: int[] a1; 方括号也可以置于标识符后面: int a1[]; 两种格式的含义是一样的,后一种格式符合C和C++程序员 的习惯。 不过,前一

Max 583

TCN实战:用Python手把手搭建时序预测模型(附完整代码)

本文详细介绍了如何使用Python搭建TCN(Temporal Convolutional Network)时序预测模型,包括数据预处理、模型架构实现、训练调优及预测评估。通过完整的代码示例和实用技巧,帮助开发者快速掌握TCN在时间序列预测中的应用,特别适合处理长期依赖问题。

weixin_29041195的博客 372

为什么数组没有实现Iterable接口,但可以使用foreach语句遍历?

在Java中,对于数组为什么能够使用foreach语句一直感觉很困惑。 对于能够使用foreach语句进行遍历的对象,只有两种情况,其中一种是遍历对象必须实现Iterable接口,实现ierator()方法,这是对象使用foreach语句的前提。另外一种情况就是特殊对象数组。那么对于数组可以使用foreach该如何去理解呢? 首先需要说明的是,实现了java.lang.Iterable接口的对

yangyongUestc的博客 2782

[Multisim][模电实验]简易函数信号发生器的设计与实现_北京邮电大学2019级信通院电子电路实验下

本文记述了笔者设计并实现以±12V供电电压输出1KHZ~10KHZ频率连续可调的方波、三角波和正弦波的过程。其中,方波输出电压峰峰值为12V(误差<20%),占空比可调、三角波输出电压峰峰值为8V(±20%),正弦波输出电压峰峰值≥1V。

lgc0208的博客 4万+

2024最新版Anaconda Navigator安装使用指南

本文简要介绍如何下载安装Anaconda Navigator最新版,以及如何使用Python内核搭载来完成应用程序开发。

jackson_lingua的博客 1万+

<java编程思想>学习笔记5,第5章 初始化和清理

1,根据返回值来区分重载方法是不行的;   2,默认构造器   如何你的写的类没有构造器,编译器会帮你创建一个默认构造器;如果已经定义了一个构造器,编译器不会再帮你创建一个   构造器。   3,this关键字   在构造器中调用构造器,   public class Flower {  int petalCount = 0;  String s = "initial va...

liguangyuanyinli的博客 124

CANoe之UDS诊断自动化测试(四):创建诊断自定义Panel发送诊断(替代Session Control窗口)

通过自定义的Panel界面实现诊断发送的功能,并且还可以根据自己的测试需求添加需要的诊断信息,使用非常灵活。

weixin_69677286的博客 1904

2026Java面试 | Java 8、Java 21、Java 25 新特性与 Spring Boot 版本对应指南:JVM 垃圾回收、版本差异与迁移实践

Java面试 | Java 8、Java 21、Java 25 新特性与 Spring Boot 版本对应指南:JVM 垃圾回收、版本差异与迁移实践

weixin_48053866的博客 642

【数据分析】R语言分段结构方程模型手把手教程(Piecewise Structural Equation Model)

分段结构方程模型(Piecewise Structural Equation Model, SEM)是一种用于分析变量之间因果关系的统计方法。它通过将复杂的因果关系分解为多个简单的线性模型来评估变量之间的直接和间接效应。与传统的结构方程模型(SEM)不同,分段结构方程模型不需要假设数据的多变量正态分布,因此在处理非正态数据时更为灵活。

专注生信领域 2649

DataCastle-租金预测

ID:编号;时间:房屋信息采集的时间;小区名:房屋所在小区,已脱敏处理;小区房屋出租数量:小区出租房屋数量,已脱敏处理;楼层:0、1、2分别表示楼层低,中,高;总层数:房屋所在建筑的总楼层数,已脱敏处理;房屋面积:房屋面积数值,已脱敏处理;房屋朝向:房屋的朝向;居住状态:房屋的居住状态,表示是否已出租或居住中,已脱敏处理;卧室数量:户型信息,数字表示卧室的个数;卫的数量:户型信息,数字表示卫生间的个数;厅的数量:户型信息,数字表示厅的个数;

优快云 精品推荐 3457

maven项目架构管理工具

mvn clean package 依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7个阶段。 mvn clean install 依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install等8个阶段。 mvn clean deploy 依次执行了clean、resources、compile、testResources、te..

梦想是很难很难的,所以先勇敢一点 224

Cadence SPB16. 6 安装流程

1.首先下载CadenceAllegroSPBorCAD16.6安装包 下载之后运行其中的setup.exe,然后先安装第一项LicenseManager 一直按next或install, 直到被询问license时,单击cancel,然后选是和finish。 2,安装Product Installtion 直接点next跳过这一步 安装完成后,点Exit退出 3.按ctrl+alt+delete打开任务管...

wangjie36的博客 5148

Java入门到精通-38 Spring Boot入门——自动配置、核心注解与Starter机制

摘要 本文介绍了Spring Boot的核心概念与快速入门指南。Spring Boot通过自动配置、Starter依赖和内嵌服务器等特性,大幅简化了Spring应用的开发流程。主要内容包括: Spring Boot概述:解释其"约定优于配置"理念,对比传统Spring开发的繁琐配置 核心特性:自动配置、Starter依赖管理、内嵌服务器等 项目创建:通过Spring Initializr快速生成项目结构 关键配置:分析pom.xml的依赖管理和启动类注解 快速开发:演示如何创建简单的REST接口 Sprin

weixin_56693899的博客 469

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Spring AI Alibaba 短时记忆实战:从 MemorySaver 到 Redis 持久化的多轮对话方案

大模型是无状态的——每次调用都不记得上一轮说了什么。在电商客服、技术助手等场景中,多轮对话的上下文连续性是基本需求。本文基于 Spring AI Alibaba 1.1.2.0 的 Agent 框架,深入讲解短时记忆(Short-term Memory)的实现原理与生产级方案:从 MemorySaver 内存存储快速上手,到 MySQL/Redis 持久化应对生产环境,再到消息修剪、删除、总结三种上下文工程策略解决长对话 Token 溢出问题。

腾讯云创作之星、华为云云享专家,深耕电商全栈高并发系统实战,分享可商用商城项目源码。 671

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

StringWriter/PrintWriter在Java输出异常信息中的作用

闲来无事,看看JUnit的源代码。刚刚开始看就发现一段有趣的代码: public String trace() { StringWriter stringWriter = new StringWriter(); PrintWriter writer = new PrintWriter(stringWriter); thrownException()

1ouis的专栏 3831

本地Spring容器关闭的时机

一、背景引入 近期开发Spring应用的时候,基本的用户功能逻辑都通过SpringMVC框架铺垫好,通过暴露给前端的API进行功能的实现。但是在设计运营后台部分的时候,由于时间有限,采用了使用Shell脚本调用Java的方式,然后产生了一个让我头痛一阵子的问题:通过Shell调用Java功能,由于需要使用到mybatis操作数据库,mybatis与dao层强绑定,故被Shell脚本调用的Java

1ouis的专栏 3363

Java中equal和"=="的区别

注:本文参考自:http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html 我在复习Java EE的时候写了一个非常简单的Servlet,只要从前台获取用户名和密码,在Servlet进行比较后得到验证结果并输出到前端。 其中servlet的代码一部分为: if(userName == "caixiaorang" && pas

1ouis的专栏 2745

LongCache机制与Long等值比较

一、背景引入 近期在开发一个项目的后台时,当项目上线后出现了一个测试环境没有出现的问题:部分用户在提交信息时提示了该信息不属于当前用户。 经过对代码的review,发现了出错的代码的开发逻辑是,在用户提交信息之后,将信息更新入数据库之前,首先判断当前的信息是否属于当前的用户;通过信息.account_id == 用户.id进行了判断,两个id都是Long类型。直觉是使用==号出错的问题,于是将

1ouis的专栏 2420

final关键字与Java编译器的小坑

一、背景引入 近期在开发一个项目的后台时,使用到了邮件发送的服务。由于考虑变化的可能性不大,将邮箱地址和发信服务器使用final static修饰符定义在一个util类中,并在发信代码中调用(而没有做成配置文件,其实后来想想,还是需要做成配置文件会更稳妥些),后面升级到服务器时发现邮箱地址需要改动,于是修改了util类中的变量内容,并将编译之后的util类的class文件覆盖到线上,结果发信地址

1ouis的专栏 1808

小谈Java的初始化问题

同学发给我一个代码如下: package hello; public class hello { public static void main(String[] args) { int i, j; int sum; for (i = 1; i <= 1000; i++) { for (j = 1, sum = 0; j <= i / 2; j++) { if (i

1ouis的专栏 1535

网易面试笔记

记录网易的一些面试题,以及自己尝试解答的答案。 1、hashMap和hashTable的区别       hashTable是一个比较老的类,继承自Dictionary类;hashMap是Java1.2引进的Map接口的一个实现。hashTable有contains()方法,而在hashMap里面该方法被取消,替代为containsKey()和containsValue()两个方法。

1ouis的专栏 1295

学习Spring3.0的笔记(杂)

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'arithmeticCalculator' defined in class path resource [applicationContext.xml]: Initia

1ouis的专栏 1258

Java内部类笔记

定义:将一个类的定义放在另一个类的定义的内部,叫做内部类。 内部类的使用场景一: public class Out { class In{ private int i = 5; } public void say(){ In in = new In(); System.out.println(in.i);//外部类是可以访问内部类的私有成员变量的

1ouis的专栏 1196

JavaEE---Servlet会话跟踪之Cookie

本文的书写参考自电子工业出版社的《Java Web程序设计》第二章第一节。 1、Cookie的创建和使用 Cookie userCookie = new Cookie("userName",userName); 两个参数分别指定了Cookie的属性名称和属性值。此外,Cookie还有其他的方法供调用: getMaxAge()/setMaxAge() 指的是读取或者设置Cookie的过期时间

1ouis的专栏 1164

JavaEE---Servlet会话跟踪之Session

Session 输入数据: package servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.s

1ouis的专栏 959

小玩Spring3.X的SpEL表达式

:-)

1ouis的专栏 891
上一篇: 数据库根据一个表确定另一个表
下一篇: <Java编程思想>持有对象(笔记)
louis9212
博客等级 码龄14年 8粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值