JVM(一) 一个小程序吸引了我

在学习JVM类的加载、连接与初始化时,遇到了这样一个小程序,感觉很有意思,大家不妨跟着我一块来感受一下。

程序

MyTest.java

class Singleton
{
	private static Singleton singleton = new Singleton();   //第一种:放在这儿运行结果是counter1=1,counter2=0
	public static int counter1;
	public static int counter2=0;
	//private static Singleton singleton = new Singleton();   //第二种:放在这儿运行结果是counter1=1,counter2=1 
	
	private Singleton()
	{
		counter1++;
		counter2++;
	}
	public static Singleton getInstance()
	{
		return singleton;
	}
}

public class MyTest
{
	public static void main(String[] args)
	{
		Singleton singleton = Singleton.getInstance();
		System.out.println("counter1="+singleton.counter1);
		System.out.println("counter2="+singleton.counter2);
	}
}

运行方式

大家可以跟着我实践一下,顺便告诉大家最简单的方式,只要你装了jdk便可以得到答案。

首先进入文件所在目录,然后输入命令javac MyTest.java,这个命令的作用是将java编译成可执行的class文件,也可以称为二进制文件。然后再输入命令java MyTest,就能得到结果。

分析结果

然后我们思考一下,为什么实例化对象这句代码放的位置不对,结果就不一样呢。

下面跟着我一起来从java程序对类的使用方式分析一下,我尽可能地扩展使读者能够对jvm类的加载、连接与使用这块多了解一些:

知识点:

Java程序对类的使用方式可分为两种:

主动使用和被动使用

所有的Java虚拟机实现必须在每个类或接口被Java程序"首次主动使用"时才初始化他们。

主动使用有六种:

1、创建类的实例

例:new Test();

2、访问某个类或接口的静态变量,或者对该静态变量赋值

例:int b=Test.a;

Test.a=b;

3、调用类的静态方法

例:Test.doSomething();

4、反射

例:Class.forName("come.tgb.Test");

5、初始化一个类的子类

例:class Parent{}

class child extends Parent

{public static int a =3;}

Child.a=4;

6、Java虚拟机启动时被标明为启动类的类

例:Test.java可能被编译成多个类文件,Test.class, Parent.class, Child.class,最终运行java Test,那么Test.class就是启动类。

除了以上6种情况,其他使用Java类的方式都被看看作是对类的被动使用,都不会导致类的初始化。

干货来了!!!

第一种输出结果为counter1=1, counter2= 0

Singleton singleton = Singleton.getInstance();
这一句使用了主动使用的第三种, 调用类的静态方法。然后就会加载Singleton类。

private static Singleton singleton = new Singleton();
首先执行这一句,new Singleton会调用构造方法。

counter1和counter2都是int型,默认初始值为0,重要!所以执行完构造方法后都变为1。

然后才执行。

public static int counter1;
public static int counter2=0;
第一行没给赋值,所以还是1;第二行赋值为0,所以counter2又由1变为0。

最后输出结果为counter1=1, counter2= 0.


第二种输出结果为counter1=1, counter2=1

加载类同第一种,首先执行

public static int counter1;
public static int counter2=0;
counter1的值是int型默认值0,第二个counter2的值被赋为0.

然后再执行

private static Singleton singleton = new Singleton();
与第一种类似,调用构造方法。

counter1和counter2的值都加1变为1.

最后输出结果为counter1=1, counter2=1


小结

都这里一切都真相大白了!JVM东西千千万,这里展示的只是其中一部分,更多关于JVM的干货请期待后面的博文!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值