字符串相加问题
题目:
public class test {
public static void main(String[] args) {
String s = "ab";
//这个字符串常量之间的相加,编译器会对其进行优化,实际上s1 = "ab" , 指向的是常量池中的地址
String s1 = "a"+"b";
String a = "a";
String b = "b";
//对于编译器无法进行优化的,会采用StringBuilder来进行字符串拼接,最后调用toString方法返回字符串,
// 而toString方法底层调用了new String()生成字符串,所以s2是在堆中创建的空间。
String s2 = a+b;
String s3 = a+"b";
System.out.println(s == s1);
System.out.println(s == s2);
System.out.println(s == s3);
}
}
答案:true false false
父子类初始化问题
题目:
class X{
Y y=new Y();
public X(){
System.out.print("X");
}
}
class Y{
public Y(){
System.out.print("Y");
}
}
public class Z extends X{
Y y=new Y();
public Z(){
System.out.print("Z");
}
public static void main(String[] args) {
new Z();
}
}
答案:YXYZ
解析:在涉及到父子类的构造顺序问题,记住两个原则即可:
①先构造父类对象,再构造子类对象
② 在初始化某个类或者是构造某个类对象的时候,先进行对类的加载,其中就涉及先加载类的静态代码块,再执行构造方法,再执行其他方法(如main方法)。