为什么会有这样的结果?

Java很神秘,有一层纸没有被捅破的话真的有很多东西貌似是解释不通,仔细探究之后就真相大白了。

这里收集几个典型的案例。

(1)字符串的那些事

public class StringTest {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String a1 = "a"+1;
		String b1 = "a1";
		String c1 = new String("a1");
		String d1 = "a";
		String i1 = "1";
		String x1 = d1+i1;
		System.out.println(a1=="a" + "1");
		System.out.println(a1=="a" + i1);
		System.out.println(a1==x1);
		System.out.println(a1==(d1+i1));
		System.out.println(a1==b1);
		System.out.println(a1==c1);
		System.out.println(a1==(d1+1));
		System.out.println(c1==(d1+1));
		System.out.println(a1==(d1+"1"));
		System.out.println(b1==(d1+"1").intern());
	}
}
执行结果:

true
false
false
false
true
false
false
false
false
true

(2)类加载与实例初始化

public class Parent {

	static {
		pA = 2;
		System.out.println("Parent static .");
	}
	static int pA = 1;

	{
		p = 2;
		System.out.println("Parent block .");
	}

	int p = 1;

	public Parent() {
		System.out.println("Parent .");
	}
}
public class Sub extends Parent {
	static {
		pB = 2;
		System.out.println("Sub static .");
	}
	static int pB = 1;
	private int b = pB;

	{
		b = 20;
		System.out.println("Sub block 1.");
	}

	public Sub() {
		System.out.println("Sub .");
	}

	{
		b = 10;
		System.out.println("Sub block 2.");
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(new Sub().b);
		System.out.println("-----1 finish---------------");
		System.out.println(new Parent().p);
		System.out.println("-----2 finish---------------");
		System.out.println(new Parent().pA);
	}
}

执行结果:

Parent static .
Sub static .
Parent block .
Parent .
Sub block 1.
Sub block 2.
Sub .
10
-----1 finish---------------
Parent block .
Parent .
1
-----2 finish---------------
Parent block .
Parent .
1
(3)类型转换

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int x=1;
		System.out.println((x>1)?1.1:1);

	}
执行结果:

1.0

(4)类加载

public class ClassLoadTest {
	private int[] args = new int[this.size];
	private int size =2;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ClassLoadTest ct = new ClassLoadTest();
		System.out.println(ct.args.length);
	}
}
执行结果:

0

(5)基本类型转换

float f = 1.2;
double d = 2.3d;
double d1=2.3D;
double d2=2.3E10;
int i = 0xFF;
int i1=025;
Integer iObj =1;
byte b =128;
char c=17c;
byte b =1;b=b+1;
byte b =1;b+=1;

错误的表达式:

float f = 1.2;

byte b=128

char c=17c;

byte b=1;b=b+1;

(6)switch的条件判定

	public static void main(String[] args) {
		int i=1;
		switch (i) {
		case 1:
			System.out.println("1");
		case 2:
			System.out.println("2");
			break;
		case 3:
			System.out.println("3");
		default:
			System.out.println("default");
		}
	}
输出结果:

1
2


你可能感兴趣的:(Java)