黑马程序员技术交流社区

标题: 菜鸟语句小问题,求解答!! [打印本页]

作者: fufeng    时间: 2014-4-10 23:53
标题: 菜鸟语句小问题,求解答!!

  1. class  Noname2
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.         Test1 t1 = new Test1("zhangsan");
  6.                 System.out.println("Hello World!");
  7.         }
  8. }
  9. class Test1
  10. {
  11.         private String name;
  12.         Test1(String name)
  13.         {
  14.                 System.out.println(""+this.name = name+"");
  15.         }
  16. }
复制代码

System.out.println(""+this.name = name+"");为什么编译的时候,这句话会出现编译错误“意外的类型”?
作者: 東少    时间: 2014-4-11 00:03
this必须写在构造方法第一行
作者: 张耀扬    时间: 2014-4-11 00:29
可以改成这样



作者: TTc    时间: 2014-4-11 01:02
本帖最后由 TTc 于 2014-4-11 01:06 编辑

因为编译器会把this.name = name当作一个变量去读,但是编译器没有见过这个变量在什么地方被定义类型,而且这个变量名也不符合书写规范。你可以System.out.println(“”+(this.name = name)+"");这样编译器就不会报错了。一起加油吧少年。
作者: 王峰峰    时间: 2014-4-11 08:51
  1. class  Noname2
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.         Test1 t1 = new Test1("zhangsan");
  6.                 System.out.println("Hello World!");
  7.         }
  8. }
  9. class Test1
  10. {
  11.         private String name;
  12.         Test1(String name)
  13.         {
  14.                 [color=Red][b]/**
  15.                  * 以下语句就相当于字符串给字符串赋值
  16.                  * 字符串是一个常量,你说能赋值吗?
  17.                  * 而""+this.name此语句就相当与把this.name的
  18.                  * 值连接成一个常量了
  19.                  */[/b][/color]
  20.             System.out.println(this.name = name);
  21.         }
  22. }
复制代码


当然修改方法,你也可以按楼上那位修改!
作者: leon_hm    时间: 2014-4-11 09:27
  1.       this.name = name;
  2.                 System.out.println(name);
  3.                 System.out.println("" + (this.name = name) + "");
  4.                 System.out.println("" + this.name + "=" + name + "");
复制代码

改成上面这写写法都没问题;
作者: H._张_♂    时间: 2014-4-11 12:37
this是赋值语句,在你这句话中,你把this放到了括号内解析,即是tostring方法执行,你这样写其实表示System.out.println((""+this.name)=(name)+"");这样当然不行,
  1. package com.itheima;



  2.         /**
  3.          * @param args
  4.          */

  5.         public class  Noname2
  6.         {
  7.                 public static void main(String[] args)
  8.                 {
  9.                 Test5 t1 = new Test5("zhangsan");
  10.                         System.out.println("Hello World!");
  11.                 }
  12.         }
  13.         class Test5
  14.         {
  15.                 private String name;
  16.                 Test5(String name)
  17.                 {
  18.                         
  19.                     System.out.println(this.name= name);//执行this.name= name,然后对这个name打印
  20.                     System.out.println(name);//赋值成功
  21.                     //System.out.println((""+this.name)=(name)+"");出错
  22.                 }
  23.         }
复制代码

作者: Mr.__ㄨīn    时间: 2014-4-11 18:13
TTc 发表于 2014-4-11 01:02
因为编译器会把this.name = name当作一个变量去读,但是编译器没有见过这个变量在什么地方被定义类型,而且 ...

为什么加个括号就不会出错了?
作者: Mr.__ㄨīn    时间: 2014-4-11 19:21
System.out.println(""+this.name=name+""); 为什么前后要加上"" ?
括号内是一个null 字符串与this.name相连 为null ,再将name值赋给null,这样肯定是错误的。
作者: TTc    时间: 2014-4-13 16:48
Mr.__ㄨīn 发表于 2014-4-11 18:13
为什么加个括号就不会出错了?

因为你在用输出语句System.out.println();时实际是在调用方法,你把参数(this.name = name)传递到你调用的println()函数中,在函数中参数被接收相当于:this.printname=(this.name=name);然后就打印的是printname;  这是我自己想的。
再看我们在java中还有这样的表达式:(floa)t(3+4);和System.out.println();相似。

作者: luoyilan222    时间: 2014-4-13 18:34
在回答问题前先说一下楼上说输出语句中不能赋值是肯定不对的;
下面我对这句分解一下你应该就明白了为啥会报错
先假设你传入值为nsername
"" + this.name = name + ""
1,首先说明一点在java中 + 的运算符优先级大于 =;
2,根据上面得出结果是 ("" + this.name) = (name + "");
应为this.name值开始时null;
3,("" + this.name)这里运算结果 null;
4,(name + "")运算结果为“username”;
最后 null = "username";
这样肯定没有意思,加上语法也是同不过的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2