A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fufeng 中级黑马   /  2014-4-10 23:53  /  1102 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  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+"");为什么编译的时候,这句话会出现编译错误“意外的类型”?

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 神马都是浮云

查看全部评分

10 个回复

倒序浏览
this必须写在构造方法第一行
回复 使用道具 举报
  • class Test1
  • {
  •         private String name;
  •         Test1(String name)
  •         {
  •                 System.out.println(""+this.name = name+"");//这一行会报错, 输出语句里怎么能有赋值语句呢?
  •         }
  • }
可以改成这样
  • Test1(String name)
  •         {
  •                 this.name = name;
  •                 System.out.println(""+this.name+"");
  •         }
  • 这样就可以正常运行了


评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 TTc 于 2014-4-11 01:06 编辑

因为编译器会把this.name = name当作一个变量去读,但是编译器没有见过这个变量在什么地方被定义类型,而且这个变量名也不符合书写规范。你可以System.out.println(“”+(this.name = name)+"");这样编译器就不会报错了。一起加油吧少年。

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 注意详细点回答

查看全部评分

回复 使用道具 举报
  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. }
复制代码


当然修改方法,你也可以按楼上那位修改!

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  1.       this.name = name;
  2.                 System.out.println(name);
  3.                 System.out.println("" + (this.name = name) + "");
  4.                 System.out.println("" + this.name + "=" + name + "");
复制代码

改成上面这写写法都没问题;
回复 使用道具 举报
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.         }
复制代码
回复 使用道具 举报
TTc 发表于 2014-4-11 01:02
因为编译器会把this.name = name当作一个变量去读,但是编译器没有见过这个变量在什么地方被定义类型,而且 ...

为什么加个括号就不会出错了?
回复 使用道具 举报
System.out.println(""+this.name=name+""); 为什么前后要加上"" ?
括号内是一个null 字符串与this.name相连 为null ,再将name值赋给null,这样肯定是错误的。
回复 使用道具 举报
TTc 中级黑马 2014-4-13 16:48:22
10#
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();相似。
回复 使用道具 举报
在回答问题前先说一下楼上说输出语句中不能赋值是肯定不对的;
下面我对这句分解一下你应该就明白了为啥会报错
先假设你传入值为nsername
"" + this.name = name + ""
1,首先说明一点在java中 + 的运算符优先级大于 =;
2,根据上面得出结果是 ("" + this.name) = (name + "");
应为this.name值开始时null;
3,("" + this.name)这里运算结果 null;
4,(name + "")运算结果为“username”;
最后 null = "username";
这样肯定没有意思,加上语法也是同不过的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马