一些基础的东西

时间:2023-01-29 16:06:11

1  Java寻找class的文件原理

javac -classpath yourpath *.java
java -classpath yourpath *.class


也许很多人都能看懂,设置classpath的目的就是告诉编译器去哪里寻找你的class文件. 不过至少笔者今日才弄懂JVM去查询类的原理,编译器加载类要依靠classloader, 而classloader有3个级别,从高到低分别是BootClassLoader(名字可能不准确) , ExtClassLoader, AppClassLoader.

这3个加载器分别对应着编译器去寻找类文件的优先级别和不同的路径:

BootClassLoader对应jre/classes路径,是编译器最优先寻找class的地方
ExtClassLoader对应jre/lib/ext路径,是编译器次优先寻找class的地方
AppClassLoader对应当前路径,所以也是编译器默认找class的地方

 

2. Java中汉字转为unicode编码的方法

JDK工具包里,已经包含了这样的工具:native2ascii.exe(在bin目录下)。转换方法:

 

 

把要转换的汉字写入一个纯文本文件,比如1.txt (Word不是纯文本格式),然后在命令行(cmd.exe)方式下键入命令 native2ascii.exe 1.txt 回车即可得到unicode的汉字编码.

 

3 类的嵌入

(1)类可以嵌入另一个类中,但不能嵌入接口中。
(2)在静态方法或其他方法中,不能直接创建内部类对象,需通过手段来取得。

手段有两种:

class A { 
  class B {
 } 
 B getB() {
  B b = new B(); 
  return b; 
 } 

static void m() {
 A a = new A(); 
 A.B ab = a.getB(); // 或者是 A.B ab = a.new B(); 
}  


(3)一个类继承了另一个类的内部类,因为超类是内部类,而内部类的构造方法不能自动被调用,这样就需要在子类的构造方法中明确的调用超类的构造方法。接上例:

class C extends A.B { 
 C() { 
  new A().super(); // 这一句就实现了对内部类构造方法的调用。 
 } 
}  


构造方法也可这样写:

C(A a) { 
 a.super(); 
} // 使用这个构造方法创建对象,要写成C c = new C(a); a是A的对象。

 

4 finalize

 若在初始化过程中需要覆盖(取消)finalize(),请记住调用super.finalize()(若Object属于我们的直接超类,则无此必 要)。在对finalize()进行覆盖的过程中,对super.finalize()的调用应属于最后一个行动,而不应是第一个行动,这样可确保在需要 基础类组件的时候它们依然有效。