今天面试遇到两个问题:
1.java类加载问题
package test;
class FatherA {
static {
System.out.println("父类静态块");
}
{
System.out.println("父类动态块1");
}
{
System.out.println("父类动态块3");
}
{
System.out.println("父类动态块2");
}
public FatherA() {
System.out.println("父类构造函数");
}
}
public class SonB extends FatherA{
static {
System.out.println("子类静态块");
}
{
System.out.println("子类动态块");
}
public SonB() {
System.out.println("子类构造函数");
}
/**
* @param args
*/
public static void main(String[] args) {
new SonB();
}
}
输出结果:
父类静态块
子类静态块
父类动态块1
父类动态块3
父类动态块2
父类构造函数
子类动态块
子类构造函数
原因分析:类加载机制,先加载父类static块,子类static块,之后加载父类动态块、构造函数,最后加载子类动态块、构造函数
2.参数传递问题
package test;
public class MethodParms {
String str="abcd";
char[] cs=new char[]{'a','b','c'};
public void ex(String a,char[] b) {
a="test";
b[0]='s';
}
/**
* @param args
*/
public static void main(String[] args) {
MethodParms mm=new MethodParms();
mm.ex(mm.str, mm.cs);
System.out.println(mm.str+":::");
System.out.println(mm.cs);
}
}
输出结果:
abcd:::
sbc
原因分析:由于java方法的参数传递都可以看为是值传递,都会传递一份拷贝的值(引用值,数值)给函数。这里的String、char[]传递的都是引用值,这里char[]参数通过拷贝的引用可以直接修改值,而String对象是不可变的,通过拷贝的引用不能直接修改值,所有这里未变。
其他:这里String的不可变性通过final char[] value保证,而StringBuffer和StringBuider通过AbstractStringBuilder的char[] value是可变的,具体可见源码。