java变量的初始化顺序小结

本文详细解析了Java中不同成员(如静态变量、静态初始化块、普通变量和初始化块等)的初始化顺序,包括无继承和有继承两种情况,并附带示例代码帮助理解。

本文转自:http://www.jb51.net/article/37885.htm,并作了增减。
1、无继承
对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序是:
(静态变量、静态初始化块)>(变量、初始化块)>构造器
public class InitialOrderTest
{
public static String staticfield=”静态变量”;
public String field=”变量”;

static
{
System.out.println(staticField);
System.out.println(“静态初始化块”);
}

{
System.out.println(field);
System.out.println(“初始化块”);
}

public InitialOrderTest()
{
System.out.println(“构造器”);
}

public static void main(String[] args)
{
new InitialOrderTest();
}
}
输出结果:
静态变量
静态初始化块
变量
初始化块
构造器

2、有继承
子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成。
class Parent {
// 静态变量
public static String p_StaticField = “父类–静态变量”;
// 变量
public String p_Field = “父类–变量”;
// 静态初始化块
static {
System.out.println(p_StaticField);
System.out.println(“父类–静态初始化块”);
}
// 初始化块
{
System.out.println(p_Field);
System.out.println(“父类–初始化块”);
}
// 构造器
public Parent() {
System.out.println(“父类–构造器”);
}
}//如果你想把这两个类放在同一个文件且名字起为SubClass, 父类前不能加public
public class SubClass extends Parent { 
// 静态变量
public static String s_StaticField = “子类–静态变量”;
// 变量
public String s_Field = “子类–变量”;
// 静态初始化块
static {
System.out.println(s_StaticField);
System.out.println(“子类–静态初始化块”);
}
// 初始化块
{
System.out.println(s_Field);
System.out.println(“子类–初始化块”);
}
// 构造器
public SubClass() {
System.out.println(“子类–构造器”);
}
// 程序入口
public static void main(String[] args) {
new SubClass();
}
}

输出结果:
父类–静态变量
父类–静态初始化块
子类–静态变量
子类–静态初始化块
父类–变量
父类–初始化块
父类–构造器
子类–变量
子类–初始化块
子类–构造器

3、静态变量和静态初始化块
静态变量和静态初始化块是按照他们在类中的定义顺序进行初始化的。同样,变量和初始化块也遵循这个规律。
public class testOrder {
// 静态变量
public static TestA a = new TestA();
public TestC c = new TestC();
// 静态变量
public static TestB b = new TestB();
public testOrder(){
System.out.println(“in constract”);
}
// 静态初始化块
static {
System.out.println(“静态初始化块”);
}
public static void main(String[] args) {
new testOrder();
}
}
class TestA {
public TestA() {
System.out.println(“Test–A”);
}
}
class TestB {
public TestB() {
System.out.println(“Test–B”);
}
}
class TestC {
public TestC() {
System.out.println(“Test–C”);
}
}

输出结果:
Test–A
Test–B
静态初始化块
Test–C
in constract

4、初始化杂记
1. 类中域的初始化:默认值为(数值为0、布尔变量为false、对象引用为null)
方法中局部变量必须明确初始化,否则会报错。
2. 如果类中提供了至少一个构造器,但是没有提供无参数的构造器,则在构造对象时如果没有提供参数就会被视为不合法。

这个是完整源码 python实现 Django 【python毕业设计】基于Python的天气预报(天气预测分析)(Django+sklearn机器学习+selenium爬虫)可视化系统.zip 源码+论文+sql脚本 完整版 数据库是mysql 本研究旨在开发一个基于Python的天气预报可视化系统,该系统结合了Django框架、sklearn机器学习库和Selenium爬虫技术,实现对天气数据的收集、分析和可视化。首先,我们使用Selenium爬虫技术从多个天气数据网站实时抓取气象数据,包括温度、湿度、气压、风速等多项指标。这些数据经过清洗和预处理后本研究旨在开发一个基于Python的天气预报可视化系统,该系统结合了Django框架、sklearn机器学习库和Selenium爬虫技术,实现对天气数据的收集、分析和可视化。首先,我们使用Selenium爬虫技术从多个天气数据网站实时抓取气象数据,包括温度、湿度、气压、风速等多项指标。这些数据经过清洗和预处理后,将其存储在后端数据库中,以供后续分析。 其次,采用s,将其存储在后端数据库中,以供后续分析。 其次,采用sklearn机器学习库构建预测模型,通过时间序列分析和回归方法,对未来天气情况进行预测。我们利用以往的数据训练模型,以提高预测的准确性。通过交叉验证和超参数优化等技术手段,我们优化了模型性能,确保其在实际应用中的有效性和可靠性。 最后,基于Django框架开发前端展示系统,实现天气预报的可视化。用户可以通过友好的界面查询实时天气信息和未来几天内的天气预测。系统还提供多种图表类型,包括折线图和柱状图,帮助用户直观理解天气变化趋势。 本研究的成果为天气预报领域提供了一种新的技术解决方案,不仅增强了数据获取和处理的效率,还提升了用户体验。未来,该系统能够扩展至其他气象相关的应用场景,为大众提供更加准确和及时的气象服务。
变量 `A: Array<Array<String>>` 是一个 **二维字符串数组**,在 Kotlin 中必须显式初始化。由于 Kotlin 的数组是固定大小且不可空的(除非声明为可空类型),你不能像 Java 那样只声明而不赋值。 --- ## ✅ 正确初始化方式 ### ✅ 方法 1:使用 `Array(rows) { Array(cols) { initialValue } }`(最常用) ```kotlin val A: Array<Array<String>> = Array(3) { // 创建 3 行 Array(2) { "" } // 每行有 2 列,初始值为空字符串 } ``` 👉 这表示创建一个 `3×2` 的二维数组,所有元素初始化为空字符串 `""`。 你可以后续赋值: ```kotlin A[0][0] = "Alice" A[0][1] = "25" A[1][0] = "Bob" A[1][1] = "30" ``` 打印: ```kotlin println(A.contentDeepToString()) // 输出:[[Alice, 25], [Bob, 30], [, ]] ``` > 🔔 注意:必须给内层每个 `Array<String>` 初始化,否则会报错! --- ### ✅ 方法 2:从已有数据构建(如 List<List<String>> 或 CSV) ```kotlin val data = listOf( listOf("id", "name"), listOf("1", "Alice"), listOf("2", "Bob") ) val A: Array<Array<String>> = data.map { row -> row.toTypedArray() }.toTypedArray() ``` ✅ 适用于从文件、API 等动态来源读取数据。 --- ### ✅ 方法 3:创建空的二维数组(0 行) 如果你暂时不知道大小,可以创建一个空数组: ```kotlin val A: Array<Array<String>> = emptyArray() ``` 这等价于 `arrayOf()`,表示没有行,但类型安全。 --- ### ✅ 方法 4:逐行手动定义再组合 ```kotlin val row1 = arrayOf("a", "b") val row2 = arrayOf("c", "d") val row3 = arrayOf("e", "f") val A: Array<Array<String>> = arrayOf(row1, row2, row3) ``` 适合小规模静态数据。 --- ## ⚠️ 常见错误写法 | 错误代码 | 问题 | |--------|------| | `val A: Array<Array<String>>` | ❌ 没有初始化,编译失败 | | `lateinit var A: Array<Array<String>>` | ⚠️ 可以,但必须确保在使用前赋值,否则运行时报错 | | `var A: Array<Array<String>>? = null` | ✅ 合法,但需要判空才能使用 | --- ## 💡 实际例子:读取 CSV 文件到 A ```kotlin import java.io.File fun readCsvTo2DArray(filePath: String): Array<Array<String>> { return File(filePath).readLines().map { line -> line.split(",").map { it.trim() }.toTypedArray() }.toTypedArray() } // 使用 val A: Array<Array<String>> = readCsvTo2DArray("data.csv") println(A.contentDeepToString()) ``` --- ## 📌 小结:如何选择初始化方式? | 场景 | 推荐方法 | |------|----------| | 已知大小,先创建后填值 | 方法 1:`Array(rows) { Array(cols) { "" } }` | | 数据来自列表或集合 | 方法 2:`.map{}.toTypedArray()` | | 暂无数据,占位用 | 方法 3:`emptyArray()` | | 静态小数据 | 方法 4:`arrayOf(arrayOf(...))` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值