1.ClassLoader的方法中 loadClass方法和forName方法目的功能类似,都是用来加载class的,但是作用上有所区别。
loadClass方法加载类在加载时并不对该类进行解释,因此不会初始化该类。而forName方法则会将Class进行解释和初始化。
2.在Java中字符只以一种形式存在,那就是Unicode(不选择任何特定的编码,直接使用它们在字符集中的编号,这是统一的唯一方法)。
所以 字符在Java中分为两部分,JVM内部和OS文件系统。在JVM内部,统一使用Unicode,当移到外部时,就需要进行编码转换。在字节和字符转换时,如InputStreamReader和OutputStreamWriter类就承担编码转换的任务。
3.普通初始化块和静态初始化块的区别:普通初始化块用来 对Java类的对象进行初始化操作,当创建Java对象时,系统总是先调用该类里定义的初始化块。
而静态初始化块是类相关的,不是对象相关,它在类初始化阶段执行,而不是在创建对象时才执行。所以静态初始化块总是比普通初始化块先执行。一个类的静态初始化块只执行一次。
普通初始化块和静态初始化块在执行时,不仅会执行本类的初始化块,还会一直追溯到java.lang.Object类(如果它包含静态初始化块),先执行java.lang.Object类的初始化块,然后执行其父类的初始化块,再一级级执行到该类的初始化块。经过了这个过程,才完成了该类的初始化过程。
总结:
1.普通初始化块是在创建类对象时才会调用,而静态初始化块是在类初始化时就会执行。
2.静态初始化块比普通初始化块先执行,静态成员独立于类产生的任何对象。
3.静态初始化块只执行一次,而普通初始化块在每次生成该类的对象时都会执行。
4.初始化块的执行会从最上级开始,一层层往下。
5.初始化块和构造器的功能是类似的,它是在构造器执行之前执行的。它们都是用来进行对象的初始化操作。
6.初始化块的存在价值在于:用来存放多个不同参数的构造器中的相同代码,从而提高代码的复用性,提高应用的可维护性。
测试代码如下:
输出结果:
4.Java中j=j++和j=++j
Java中采用了中间缓存变量的机制,j=j++就相当于
同理,j=++j也就相当于
测试代码:
5.toString()方法
Integer,Float,Double,Boolean等类都存在toString()方法,用法如下
另外,将字符型变量转换为数值型变量时有两种对应关系:一种是对应的ASCII码,另一种是转换关系,使用Character的getNumericValue(char ch)方法。如'1'转换为1.
6.assert语句的意义和用法
从理论上来说,通过assertion方式可以证明程序的正确性,但是这是一项相当复杂的工作,目前还没有太多的实践意义。
在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。
一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。
assert关键字语法很简单,有两种用法:
1、assert <boolean表达式>
如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出AssertionError,并终止执行。
2、assert <boolean表达式> : <错误信息表达式>
如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出java.lang.AssertionError,并输入<错误信息表达式>。
编译:javac -source 1.4 Test.java
运行:java -ea Test
7.main()必须要是public static void类型的原因
java程序在运行时,首先运行的就是main()函数,该运行过程是由虚拟机JVM执行main()的,因此必须为public类型。
调用时虚拟机不会实例化这个类的对象,而是通过类名直接调用因此限制为static.
另外,JVM限制main()方法不能有返回值,因此返回值类型为void.
而且java程序的main()方法必须带一个String参数,否则会报NoSuchMethodError异常。
8.(? :)涉及的类型转换
false ? 1.0 : 2
该语句输出结果为2.0 而不是2
char x = 'x';
false ? 10 : x
此时的输出结果为x,而不是其int值120 当后两个表达式有一个是常量表达式,而此常量表达式可以被另一个类型T所表示时,输出结果是T类型。如果不能被T所表示,那么输出结果就需要进行自动类型转换了。
例如如果上式为false ? 10.0 : x时,输出结果就为120.0了。
9.移位操作符 '>>' '<<'
移位操作符右边的参数要先进行 模32运算 再对其二进制值进行移位。例如
int num = 32;
num >> 32;
即是右移0位
num >> 33;
右移1位
10.throw和throws关键字的区别
throw用来抛出一个异常,在方法体内。语法格式为:throw 异常对象。
throws用来声明方法可能会抛出什么异常,在方法名后,语法格式为:throws 异常类型1,异常类型2...异常类型n。