Java中极其微妙的String拼接运算的优先顺序,Object的重写toString()方法和成员方法运算的优先级

上课的时候做的一个例题,很有意思,就是关于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从入门到放弃

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值