java基本点

今天面试遇到两个问题:

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

父类构造函数

子类动态块

子类构造函数

扫描二维码关注公众号,回复: 515602 查看本文章

原因分析:类加载机制,先加载父类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是可变的,具体可见源码。



 

猜你喜欢

转载自1023367398.iteye.com/blog/2357109