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