不知道你在问什么 你是说这样不报错吗
public void method(Animal a) {
if (a instanceof Dog){
Dog d = (Dog) a;
}
}
你应该new一个Dog d = (Dog)a才行 作者: hm372012 时间: 2015-6-21 22:45 本帖最后由 hm372012 于 2015-6-22 00:40 编辑
这里转类型,不用new,下面加了大括号就不报错了
public void method(Animal a) {
if (a instanceof Dog){
Dog d = (Dog) a;
}
}作者: ARD 时间: 2015-6-21 23:30
没看懂 ,, if()如果不加括号只能控制一个语句.不会报错. 报错也是其他问题不会是if.作者: g552092947 时间: 2015-6-21 23:34
我觉得,错不是错在if大括号那里作者: bingyu 时间: 2015-6-21 23:34
应该不是if的问题吧作者: guohaichang 时间: 2015-6-21 23:49
应该是这样的,局部变量声明是要在语句块里进行的。if后边不能是一个声明语句,应该跟一个执行语句。道理上讲,这样才有意义。如果是跟一个声明语句,就是条件编译了,不是if的菜,错就在这了。作者: 双栖动物 时间: 2015-6-21 23:51
如果if后面只有一条语句 可以不加的作者: JJJD 时间: 2015-6-22 00:12
来学习了。。。作者: 我是隔壁老王呀 时间: 2015-6-22 06:14
Dog d = (Dog) a;
这句可以分成两部分看待:
Dog d;
d = (Dog) a;
其实这句是没错的。作者: 我是隔壁老王呀 时间: 2015-6-22 06:28 本帖最后由 我是隔壁老王呀 于 2015-6-22 10:46 编辑
因为
public void method(Animal a) {
if (a instanceof Dog)
Dog d = (Dog) a;
}
这里面的 Dog d = (Dog) a;这句在编译时候是这样的
{
Dog d;
d = (Dog) a;
}
Dog d = (Dog) a;在编译器编译时其实分解为两条语句,你不加大括号,相当于只执行第一条语句Dog d; 这是一条声明语句,且是局部变量声明语句,而对于if语句则需要是执行语句,不能只是声明语句,这是第一个错误。而且局部变量有其作用范围,当执行完Dog d;时,局部变量d的作用范围已经结束,后面再使用d就会报错,因为在内存中并么有d的空间,这是第二个错误。
可以这样修改:
...
Dog d;
if(a instanceof Dog)
d= (Dog) a;
...
这样编译器没有错误。因为此时d的作用范围包含if的执行语句,且if后面的语句就是d= (Dog) a;是一条明确的执行语句。所以就不会报错。 而你在if后加{}也是一样的道理,既扩大了d的作用范围,又有执行语句可以执行,所以编译器就能通过。
作者: lvzhfeng 时间: 2015-6-22 07:24
试了一下, 这样不报错。
if (a instanceof Dog)
{
Dog d;
d = (Dog)a;
d.eat();
}
因为此时局部变量d的作用域在大括号里面
单独写了一个Test类,实验了一下,也是不行。