今天面试遇到两个问题:
1.java类加载问题
class="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是可变的,具体可见源码。
?