五、JAVA中类的探究-类变量的初始化时机

本文深入探讨了JAVA中类变量的初始化时机,包括在定义时指定初始值和静态初始化块中的初始化。通过示例代码解释了类变量初始化的过程,强调了类变量只会初始化一次。此外,还讨论了final关键字在方法和类中的应用及其影响,强调了final类和方法的不可继承和不可覆写特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、类变量的初始化时机

(1)

JAVA的类不同于C++的类 能在类里执行main函数就是让我惊奇的一点

JAVA程序可以在这两个地方对类变量执行初始化:

定义类变量时指定初始值

静态初始化快中对类变量指定初始值



代码如下

public class StaticInitTest
{
	static int count = 2;
	static
	{
		System.out.print("StaticInitTest的静态初始化块:");
		name = "JAVA编程";
	}

	static String name = "crazy JAVA";

	public static void main(String[] args)
	{
		System.out.println("count类变量的值:" + StaticInitTest.count);
		System.out.println("name类变量的值:" + StaticInitTest.name);
	}

}

运行结果

StaticInitTest的静态初始化块:count类变量的值:2
name类变量的值:crazy JAVA


学习心得

针对name类:先赋值为”JAVA编程“ 再赋值为”疯狂JAVA讲义“ 

但运行程序一次 只初始化一次

——————————

百度知道上对于我的疑问的解释:

java属于边解释边执行的语言,java编译的结果是class文件,并能直接在机器上运行,而是又java虚拟机代理的,java虚拟机在解释时是先遍历class文件的,把class文件中所涉及到的类都会遍历到,直接加载到内存中


(2)

代码如下

class Price
{
	final static Price INSTANCE = new Price(2.8);
	static double initPrice = 20;
	double currentPrice;

	public Price(double discount)
	{
		currentPrice = initPrice - discount;

	}

	public static void main(String[] args)
	{
		System.out.println("通过Price的INSTANCE访问currentPrice实例变量:"
				+ Price.INSTANCE.currentPrice);
		Price P = new Price(3.5);
		System.out.println("通过显示创建的Price实例P访问currentPrice实例变量:"
				+ P.currentPrice);
	}

}


运行结果

通过Price的INSTANCE访问currentPrice实例变量:-2.8
通过显示创建的Price实例P访问currentPrice实例变量:16.5


学习心得

对INSTANCE赋值时调用Price(2.8) 创建Price实例

此事立即执行currentPrice赋值 initPrice类变量的值=0

故currentPrice=0-2.8=2.8 程序再将initPrice赋为20


当Price类初始化完成后 INSTANCE类变量引用到一个currentPrice为-2.8的Price实例

此时initPrice=20.0

————————————

final方法
将方法声明为final,那就说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。另外有一种被称为inline的机制,它会使你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提高,然而当你的方法主体非常庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而会影响效率,所以你要慎用final进行方法定义。


final类
当你将final用于类身上时,你就需要仔细考虑,因为一个final类是无法被任何人继承的,那也就意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。对于final类中的成员,你可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了final型的。你也可以明确的给final类中的方法加上一个final,但这显然没有意义。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值