上课的时候做的一个例题,很有意思,就是关于Object中toString()方法的运用,当然个人觉得是在实际使用中极少使用的,但是较真的我还是想琢磨下真实的优先顺序。
废话少收,先上改了之后的代码:
public class No_03 {
public static class ToStringTest {
static int i = 1;
public static void main(String args[]) {
System.out.println("love " + new ToStringTest() + stringTest());//就是这段!!细细品味一下优先级别
ToStringTest a = new ToStringTest();
a.i++;
System.out.println("me " + a.i);//me 2
}
/*
由于默认的toString()是
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
因此无法参与运算,若想参加运算,必须重写toString方法
*/
public String toString() {
System.out.print("I ");//I
return "java ";
}
}
// 构造一个成员方法
public static String stringTest() {
System.out.print("J ");
return "java2";
}
}
由于toStringTest是一个Class,所以默认extends Object的属性,在该Class参加运行时,会先执行默认声调的toString()方法。所以运算时可以用new toStringTest()得到一个返回值,但是无法单独接受这个返回时,比如String s = new toStringTest()是不允许的!
String s = "A "+ new ToStringTest();
System.out.println(s);
//上面这个方法可以运行
// String ss = new ToStringTest()是无法运行的
System.out.println("love " + new ToStringTest() + stringTest());
//就是这段!!细细品味一下优先级别
单独拉出来看看,这里面涵盖了正常的拼接运算,新建类和成员方法。
可以将这段代码看作运算表达式,即考虑各个成员的优先级,就比如 “%”的优先级大于“+”,这里就看看新建类和成员方法的优先级。
执行时,首先对各个成员进行计算,统一为String类型
所以先执行new ToStringTest()和stringTest(),然后再进行各个成员的拼接。
其中new ToStringTest()在得到返回值“java”,参加运算前就输出了“I”;
同理,stringTest()在得到返回值“java2”,参加运算前就输出了“J”;
然后进行拼接输出:love java java2。
但是new ToStringTest()和stringTest()二者谁先进行呢,也就是说“I”和“J”谁先被输出出来的问题:
这里就先给大家看下运行结果:
J I love java java2
me 2
从结果上来看,stringTest()的执行优先级高于new ToStringTest()。
因此,在字符串进行拼接运算时,成员方法 > 新建类。
以上仅是个人理解,欢迎交流指正。
——————————————————
用实力行动记录Java从入门到放弃