Java程序员面试宝典-零碎知识汇总一

1.ClassLoader的方法中 loadClass方法和forName方法目的功能类似,都是用来加载class的,但是作用上有所区别。

loadClass方法加载类在加载时并不对该类进行解释,因此不会初始化该类。而forName方法则会将Class进行解释和初始化。

 

2.Java中字符只以一种形式存在,那就是Unicode(不选择任何特定的编码,直接使用它们在字符集中的编号,这是统一的唯一方法)。

所以 字符在Java中分为两部分,JVM内部和OS文件系统。在JVM内部,统一使用Unicode,当移到外部时,就需要进行编码转换。在字节和字符转换时,如InputStreamReaderOutputStreamWriter类就承担编码转换的任务。


3.普通初始化块和静态初始化块的区别:普通初始化块用来 Java类的对象进行初始化操作,当创建Java对象时,系统总是先调用该类里定义的初始化块。

 而静态初始化块是类相关的,不是对象相关,它在类初始化阶段执行,而不是在创建对象时才执行。所以静态初始化块总是比普通初始化块先执行。一个类的静态初始化块只执行一次。

 普通初始化块和静态初始化块在执行时,不仅会执行本类的初始化块,还会一直追溯到java.lang.Object类(如果它包含静态初始化块),先执行java.lang.Object类的初始化块,然后执行其父类的初始化块,再一级级执行到该类的初始化块。经过了这个过程,才完成了该类的初始化过程。

 

 总结:

 1.普通初始化块是在创建类对象时才会调用,而静态初始化块是在类初始化时就会执行。

 2.静态初始化块比普通初始化块先执行,静态成员独立于类产生的任何对象。

 3.静态初始化块只执行一次,而普通初始化块在每次生成该类的对象时都会执行。

 4.初始化块的执行会从最上级开始,一层层往下。

 5.初始化块和构造器的功能是类似的,它是在构造器执行之前执行的。它们都是用来进行对象的初始化操作。

 6.初始化块的存在价值在于:用来存放多个不同参数的构造器中的相同代码,从而提高代码的复用性,提高应用的可维护性。

 

 测试代码如下:

 

 1  package classmate;
 2 
 3  public  class Team {
 4      public  static  void main(String[] args) {
 5  
 6         Person p =  new Person();
 7         System.out.println("------------------------------");
 8         Person p1 =  new Person();
 9     }
10 }
11 
12  class Person{
13      // 构造方法
14       public Person(){
15         System.out.println("Person Constructor...");
16     }
17  
18      // 初始化代码块
19      {
20         System.out.println("Person Initialization Block...");
21     }
22  
23      // 静态代码块
24       static {
25         System.out.println("Person Static Block...");
26     }
27 }

 

输出结果:

 

Person Static Block...
Person Initialization Block...
Person Constructor...
------------------------------
Person Initialization Block...
Person Constructor...

 

 

4.Javaj=j++j=++j

Java中采用了中间缓存变量的机制,j=j++就相当于

 

temp=j;
j=j+1;
j=temp;

 


同理,j=++j也就相当于

 

j=j+1;
temp=j;
j=temp;

 

 

测试代码:

 

 1  import java.util.*;
 2 
 3  public  class Test{
 4      public  static  void main(String [] args){
 5          int j = 0;
 6          for( int i = 0; i < 100; i++){
 7             j = j++;
 8         }
 9         System.out.println(j);
10     }
11 }

 

 

5.toString()方法

IntegerFloatDoubleBoolean等类都存在toString()方法,用法如下

 

 1  public  class Test{
 2    public  static  void main(String [] args){
 3     int i1 = 10;
 4     float f1 = 3.14f;
 5     double d1 = 3.1415926;
 6    Integer I1 =  new Integer(i1);
 7    Float F1 =  new Float(f1);
 8    Double D1 =  new Double(d1);
 9    String si1 = I1.toString();
10    String sf1 = F1.toString();
11    String sd1 = D1.toString();
12    System.out.println("si1 " + si1);
13    System.out.println("sf1 " + sf1);
14    System.out.println("sd1 " + sd1);
15   }
16 }

 

 

另外,将字符型变量转换为数值型变量时有两种对应关系:一种是对应的ASCII码,另一种是转换关系,使用CharactergetNumericValue(char ch)方法。如'1'转换为1.


6.assert语句的意义和用法

从理论上来说,通过assertion方式可以证明程序的正确性,但是这是一项相当复杂的工作,目前还没有太多的实践意义。

在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。

一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。

assert关键字语法很简单,有两种用法:

1assert <boolean表达式>

如果<boolean表达式>true,则程序继续执行。

如果为false,则程序抛出AssertionError,并终止执行。

2assert <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,而不是其int120 当后两个表达式有一个是常量表达式,而此常量表达式可以被另一个类型T所表示时,输出结果是T类型。如果不能被T所表示,那么输出结果就需要进行自动类型转换了。

例如如果上式为false ? 10.0 : x时,输出结果就为120.0了。


9.移位操作符 '>>'  '<<'

移位操作符右边的参数要先进行 32运算 再对其二进制值进行移位。例如

int num = 32;

num >> 32;

即是右移0

num >> 33;

右移1


10.throwthrows关键字的区别

throw用来抛出一个异常,在方法体内。语法格式为:throw 异常对象。

throws用来声明方法可能会抛出什么异常,在方法名后,语法格式为:throws 异常类型1,异常类型2...异常类型n

 

你可能感兴趣的:(java)