java基础知识总结
对应不同的操作系统平台有不同的java虚拟机
jdk>jre>jvm
classpath配置的作用:一个类要用到另一个类到classpath路径中去,在jdk1.5中默认是在当前目录下去查询要运行的.class文件
path:在path去找到运行的javac命令
java_home:配置好后其它软件运行只需要在%JAVA_HOME%/bin,查找到javac与其它的命令
在.java文件中,只能有一个public类。
1.使用命令行的方式
.java文件名如果与主类中的class文件不同,则运行程序步骤是:
1.javac 文件名.java
2.java 主类名
2.使用eclipse中书写java文件
运行.java文件,如果主类没有没有去写public类型,而且主类文件名与.java程序文件名不同,则会出现运行出错,因为eclipse会去找同名的class文件去运行
运行步骤是:
1.javac 文件名.java
2.java 文件名
类的加载
程序运行过程是:ClassLoader将其Load到内存中CodeSegment,运行环境找到main方法开始执行,classsLoader的类加载机制是并非一次性加载,需要的时候加载(运行期间动态加载)
如果想要得到class加载时候的详细信息
需要在Aguments的Vm arguments中加载-verbose:class
关于class loader的层次关系(不是继承)
classloader在load class的时候首先找上层loader是不是load过了,如果已经load了,就不会再此load
因此导致安全性是非常好的,自己写的String.class永远没有机会执行(破坏性代码),即如果重写java.lang.String代码自己的写永远无法执行,因为jre已经load过这个class文件了,加不会再加载用户写的java.lang.String文件
java.lang.Class
代表了load到内存中的Class对象
Object的getClass()可以拿到该类对象(等同于类名:.class)
Class的getClassLoader可以拿到装载这个class的ClassLoader
所有的classloader都是从
ClassLoader这个类继承而来
System.out.println(com.gudai.NumTest.class.getClassLoader().getClass().getName());
application classloader中有一个parent引用指向ext class loader而后以此类推
分别得到classloader的名称
得到最开始的classloader
System.out.println(String.class.getClassLoader());
得到当前类的classloader即ApplicationClassLoader
System.out.println(com.gudai.NumTest.class.getClassLoader().getClass().getName());