现在的位置: 首页 > 综合 > 正文

JAVA 类加载 类实例化 调试

2013年10月17日 ⁄ 综合 ⁄ 共 1862字 ⁄ 字号 评论关闭

最近没事学习学习JAVA语言,复习复习大学学的第一门编程语言。再打打基础~

好了,废话少说,直接正题~

 

1.虽然JAVA拥有自动回收内存机制,开发人员完全可以不必担心对象实例回收问题,但是这种机制也导致回收滞后。因此,在开发的时候,内存资源占用问题仍然要考虑。我们可以看下下面这段代码:

While(rs.next())

{

ResultSet rs1=...//构建了ResultSet的实例

//类可以说是一段符合类规范的源代码,也可以说是这段源代码编译生成的class,在没有

//使用之前,系统内存中并没有类的影子,类也只是硬盘里的一段字节罢了。

...

}

 

这段程序是数据库查询操作过程中很多人常做的,一旦数据表的量达到一定的程度之后,内存中就生成了大量的ResultSet实例,很可能会抛出异常,系统资源已经耗尽。这种情况一旦发生就会造成系统资源的损失。

 

 

2.异常处理:

finally中进行最后的处理,通常在finally中完成资源的关闭操作,例如数据连接的关闭,网络连接的管理,文件的关闭等工作。

 

异常处理机制会影响程序的执行效率,对于实时性要求很高的程序来说,要适当避免对try...catch的使用。

 

 

3.静态

当调用Class.forName();的时候,或者调用静态方法和访问静态变量的时候都会完成类的加载,但是并没有实例化类。(可单步调试观察)

 

静态变量:JVM为静态变量在内存中分配一个且只分配一个存储位置,也就是如果生成一个对象的多个实例,但是这些实例的静态变量只会指向同一个内存位置。

static int i=1;

静态代码段:是指在类中的一段代码,它并不存在于任何方法中,如

Static{

System.out.println("Static1");

}

Static代码段在加载类的时候执行,同一个类的静态代码段在同一个进程中只会执行一次。

静态方法:类在实例化的时候会消耗系统资源,很多时候我们需要执行一段代码,但是并不想构造一个类,这时就可以利用静态方法。静态方法在加载类的时候就会加载 到内存静态存储区,无需构造类的实例就可以调用。

 

当一个含有静态程序段的类构造的时候,先执行静态程序段,再按照继承顺序执行构造函数。这是因为构造静态变量,执行静态程序段是在类加载的时候完成的,而类加载是在类实例构造前完成的。(可通过单步调试验证)

 

在eclipse的debug模式下调试如下图所示,首先我们在第4,6,9行设置断点,然后F11一下,得下图:

从图中我们可以看到modification和clinit,知道程序正在执行的动作。然后F8一下,得

 

程序在6处suspended,完成输出"Static1".接下来F5可以看到加载和实例化的整个过程:

 

 

进入ClassLoader类进行加载。

 

进入方法类中。

 

在第三个断点处暂停。接下来进行实例化工作。

 

 

注意debug中用的是init!刚才一开始的时候我们看到的clinit估计是classload init.关于这两个的区别网上也有相应的解释,个人感觉经过这种单步调试之后,基本可以明白了。

下面是进入父类Object,默认从Object继承。

我们看到Thread下面有三个蓝色图标,我猜应该是栈示意图。

再F5一下,少了最上面一个蓝色图标,估计我的猜想是正确的。从栈顶pop了一个element.

 

最后看下执行完a.i++后的b.i的值

从图中悬浮框可以看到static的变量i的值为2.

 

这样整个类加载和类实例化,以及static的测试就到此了~

好吧,写了这么多代码之后重新回过头来学习JAVA,感觉还真有点意思,想当初学习的时候哪会考虑这些问题,直接一个System.out.print("Hello World.");就知道可以在控制台上输出字符串了~,也不知道是怎么实现的~现在再学习学习研究研究,基础决定高度,呵呵,为这个可能是大学最后一个Android项目做好充分的准备,so压力~~

抱歉!评论已关闭.