Thinking in java 之:静态数据的初始化及初始化顺序

无论创建了多少个对象,静态数据都只占用一份存储区域,static关键字不能应用于局部变量,因此它只能作用于域。如果一个域是静态的基本类型域,且也没有对它进行初始化,那么它就会获得基本类型的标准初值,如果它是一个对象引用,那么它的默认初始化值就是null。

实例:

public class StaticInitialization {
	static Bowl b11 = new Bowl(11);
	// 非静态成员变量,不在静态域中,不会被初始化
	Bowl b22 = new Bowl(22);

	// 静态方法不在静态域中,不会被初始化
	public static void ss() {
		System.out.println("我是静态方法");
	}
	static {
		System.out.println("我是静态代码块");
	}

	public StaticInitialization() {
		System.out.println("初始化主类");
	}

	public static void main(String[] args) {
		System.out.println("sss");
	}
}

class Bowl {
	Bowl(int marker) {
		System.out.println("Bowl(" + marker + ")");
	}
}

打印结果:

Bowl(11)
我是静态代码块
sss

从打印结果看出,在调用main方法的时候,首先会加载main所在的这个类,会将这个类中所有静态域中的内容进行初始化(静态域包含静态基本类型变量和静态引用类型变量)。


了解了静态域的初始化,那么初始化顺序是怎样的呢?

实例:

public class OrderOfInitialization {
	OrderOfInitialization() {
		int a = 111;
		String b = "aa";
		System.out.println("初始化主类");
		System.out.println(b.toString());
	}

	static Window w5 = new Window(5);
	static {
		Window w6 = new Window(6);
	}
	public static void main(String[] args) {
		House h = new House(1);
		House h2 = new House(2);
		System.out.println("最后吗");
	}
}

class Window {
	Window(int marker) {
		System.out.println("Window(" + marker + ")");
	}
}

class House {
	static {
		Window w7 = new Window(7);
		w7 = new Window(8);
	}
	Window w3 = new Window(3);
	House(int marker) {
		System.out.println("House(" + marker + ")");
		Window w1 = new Window(1);
	}

	static void test() {
		System.out.println(1111);
	}

	static Window w4 = new Window(4);
	Window w2 = new Window(2);
}

打印结果:

Window(5)
Window(6)
Window(7)
Window(8)
Window(4)
Window(3)
Window(2)
House(1)
Window(1)
Window(3)
Window(2)
House(2)
Window(1)
最后吗

从上面的结果可以总结出类中的初始化顺序和结论:

1.静态成员>非静态成员,并且按顺序初始化。

2.构造方法外的成员变量>构造方法内的成员变量

3.不能在方法中定义和初始化静态数据成员。

4.无论创建多少个对象,静态域中的变量只会被初始化一次。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《Thinking in Java》是一本经典的Java编程入门教材,通过阅读该书可以系统地学习Java编程的基础知识和高级概念。阅读过程中,我结合自己的学习体验和实践,进行了详细的学习笔记。 首先,该书从基础语法开始介绍,包括数据类型、控制语句、数组等。对于初学者来说,这些基础知识是最基本的,通过书中的示例代码和解析,我能够更好地理解这些概念和语法规则。 其次,书中对面向对象编程进行了深入的讲解。通过学习面向对象的思想,我明白了类、对象、继承、多态等概念的含义和使用方法。同时,书中还讲解了接口、内部类、异常处理等较为高级的概念,极大地拓宽了我的Java知识面。 另外,该书还介绍了Java的常见类库和工具,如字符串操作、集合框架、输入输出、线程等。这些内容对于实际开发非常有用,而且书中的示例代码也能帮助我更好地理解和应用这些类库和工具。 此外,该书通过大量的实例和案例,生动地展示了Java编程的实战应用。这些实例涵盖了各种不同的应用场景,从简单的程序到复杂的项目,都有所涉及。通过分析这些实例,我不仅可以学习到实际编程的技巧,还能提高自己的解决问题的能力。 总的来说,读完《Thinking in Java》后,我对Java编程有了更深入的理解和掌握。通过学习笔记的整理,我不仅复习了各个知识点,还加深了对这些概念的理解。希望这份学习笔记能够帮助到其他想要学习Java的同学,让他们能够更快地入门和掌握这门编程语言。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值