JAVA 类加载 类实例化 调试
2010-11-06 13:31
127 查看
最近没事学习学习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压力~~
好了,废话少说,直接正题~
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代码段在加载类的时候执行,同一个类的静态代码段在同一个进程中只会执行一次。
静态方法:类在实例化的时候会消耗系统资源,很多时候我们需要执行一段代码,但是并不想构造一个类,这时就可以利用静态方法。静态方法在加载类的时候就会加载 到内存静态存储区,无需构造类的实例就可以调用。
当一个含有静态程序段的类构造的时候,先执行静态程序段,再按照继承顺序执行构造函数。这是因为构造静态变量,执行静态程序段是在类加载的时候完成的,而类加载是在类实例构造前完成的。(可通过单步调试验证)
]package jead.chap2; public class Static1 { static int i = 1;//静态变量 static {//静态代码段 System.out.println("Static1"); } public static void main(String args[]) {//静态方法 Static1 a = new Static1(); Static1 b = new Static1(); a.i++; System.out.println("a.i=" + a.i + " b.i=" + b.i); } }
在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压力~~
相关文章推荐
- java 实例化过程 和 程序加载
- Java类加载及实例化的顺序心得
- java加载第三方jar并实例化类
- think in java 阅读笔记(类的加载和实例化)
- JavaWeb调试技巧与配置文件加载顺序
- Java读取Properties文件 Java加载配置Properties文件
- 调试NTDLL加载
- 调试虚拟机[置顶] 关于AndroidRuntime: FATAL EXCEPTION: GLThread 10 java.lang.IllegalArgumentException问题
- eclipse调试java程序的九个技巧
- Java 类何时会被加载进JVM
- 浅谈Java中父类与子类的加载顺序详解
- 网格应用通讯模块Java调试说明
- (转)Ubuntu下JDK7安装全过程并调试第一个带包的java程序
- Java中Filter、Listener,拦截器的学习,listener、 filter、servlet 加载顺序及其详解
- java中类加载机制、类加载过程和类加载器层次
- javac 及 java命令的使用问题(错误或无法加载主类)
- 解决ThinkPHP中开启调试模式无法加载模块的问题
- Java实现配置加载机制
- Java程序员应该知道的10个调试技巧
- java 远程调试配置linux下的tomcat服务器