试了一下, 这样不报错。
if (a instanceof Dog)
{
Dog d;
d = (Dog)a;
d.eat();
}
因为此时局部变量d的作用域在大括号里面
单独写了一个Test类,实验了一下,也是不行。- class Test
- {
- public static void method(Person p)
- {
- if(p instanceof Student)
- Student stu = (Student)p;
- }
- }
- class Person
- {
- private String name;
- private int age;
- Person(String name,int age)
- {
- this.name = name;
- this.age = age;
- }
- public void method()
- {
- System.out.println("name="+name+"age="+age);
- }
- }
- class Student extends Person
- {
- Student(String name,int age)
- {
- super(name,age);
- }
- public void study()
- {
- System.out.println("study");
- }
- }
- class Demo
- {
- public static void main(String[] args)
- {
- Student p = new Student("Jack",20);
- new Test().method(p);
- }
- }
复制代码
我考虑是这样的Dog d = (Dog) a;并非是两个语句,但是此时声明的d是局部变量,如果只有一条声明,那么这条语句就没有意义,只会制造内存垃圾。但是加上括号,系统默认你将使用多行语句,d的作用域变大,而可能不仅仅只是声明。
一句话:不加括号,声明d一定没有意义。加上括号,d可能在该作用域中用到。
所以一定没意义的,系统有义务报错;可能有意义的,系统不会报错(尽管声明的d真没什么用) |