Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个Java强制转换会抛出错误?_Java_Oop_Casting - Fatal编程技术网

为什么这个Java强制转换会抛出错误?

为什么这个Java强制转换会抛出错误?,java,oop,casting,Java,Oop,Casting,我想知道为什么在obj=w之后引用“w”将抛出一个错误。您不只是通过说obj=w来创建另一个指向该w实例的指针吗?也就是说,为什么说像String s=“hi”这样的话不同;字符串w=s谢谢 public class Casting { public static void main(String[] args) { // casting doesn't change the object Object obj; { Stopwat

我想知道为什么在
obj=w之后引用“w”将抛出一个错误。您不只是通过说obj=w来创建另一个指向该w实例的指针吗?也就是说,为什么说像
String s=“hi”这样的话不同;字符串w=s谢谢

public class Casting {
   public static void main(String[] args) {
      // casting doesn't change the object
      Object obj;
      { 
          Stopwatch w = new Stopwatch();
          obj = w;
      }
      System.out.println(obj); // this line does work
      System.out.println(w); //this line does not work 
   }
}

变量
w
在块内声明,因此在块外它不存在。这个问题与铸造无关。拆下支架,它将起作用:

public class Casting {
   public static void main(String[] args) {
      // casting doesn't change the object
      Object obj;
      Stopwatch w = new Stopwatch();
      obj = w;
      System.out.println(obj);
      System.out.println(w);
   }
}

变量
w
在块内声明,因此在块外它不存在。这个问题与铸造无关。拆下支架,它将起作用:

public class Casting {
   public static void main(String[] args) {
      // casting doesn't change the object
      Object obj;
      Stopwatch w = new Stopwatch();
      obj = w;
      System.out.println(obj);
      System.out.println(w);
   }
}

正如其他答案中所述,移除大括号将起作用。如果您想保留支架,请执行以下操作。实际上在java中,变量有作用域,一个变量可以在声明它的作用域中使用。就像在“if”块或“try”块中声明某个变量一样,它只能在该范围内使用。 这有助于有效的垃圾收集。始终最好在所需的最小范围内定义变量但是,如果您在某处创建某个对象,但希望在该部分(块)之后使用它,则在块外声明(变量不需要创建对象)

public class Casting {
public static void main(String[] args) {
  // casting doesn't change the object
   Object obj;
  Stopwatch w ;
  { 
      w = new Stopwatch();
      obj = w;
  }
  System.out.println(obj); // this line does work
  System.out.println(w); //this line does not work 
  }
}

正如其他答案中所述,移除大括号将起作用。如果您想保留支架,请执行以下操作。实际上在java中,变量有作用域,一个变量可以在声明它的作用域中使用。就像在“if”块或“try”块中声明某个变量一样,它只能在该范围内使用。 这有助于有效的垃圾收集。始终最好在所需的最小范围内定义变量但是,如果您在某处创建某个对象,但希望在该部分(块)之后使用它,则在块外声明(变量不需要创建对象)

public class Casting {
public static void main(String[] args) {
  // casting doesn't change the object
   Object obj;
  Stopwatch w ;
  { 
      w = new Stopwatch();
      obj = w;
  }
  System.out.println(obj); // this line does work
  System.out.println(w); //this line does not work 
  }
}

没有什么比早上第一件事引用JLS更好的了

JLS 6.3。声明的范围:

块(§14.4)中局部变量声明的范围是声明出现的块的其余部分,从其自身的初始值设定项开始,并包括局部变量声明语句右侧的任何其他声明符

JLS 14.2。区块:

块是大括号内的一系列语句、局部类声明和局部变量声明语句

这对你来说意味着什么?本地变量be
w
在块中声明

{ 
    Stopwatch w = new Stopwatch();
    obj = w;
}
public static void main(String[] args) {
  
    Object obj;
    { 
        Stopwatch w = new Stopwatch();
        obj = w;
    }
    System.out.println(obj);
    System.out.println(w);
}
(“它自己的初始值设定项”是块中的第一行),因此它的作用域是该块的其余部分。提到它

System.out.println(w); 
在块之外,因此
w
将无法解析为变量

那么局部变量obj如何呢?它是在区块中声明的

{ 
    Stopwatch w = new Stopwatch();
    obj = w;
}
public static void main(String[] args) {
  
    Object obj;
    { 
        Stopwatch w = new Stopwatch();
        obj = w;
    }
    System.out.println(obj);
    System.out.println(w);
}
在这种情况下,它是一个方法块。电话

System.out.println(obj);

在块内,因此可以成功引用
obj

没有什么比早上第一件事引用JLS更好的了

JLS 6.3。声明的范围:

块(§14.4)中局部变量声明的范围是声明出现的块的其余部分,从其自身的初始值设定项开始,并包括局部变量声明语句右侧的任何其他声明符

JLS 14.2。区块:

块是大括号内的一系列语句、局部类声明和局部变量声明语句

这对你来说意味着什么?本地变量be
w
在块中声明

{ 
    Stopwatch w = new Stopwatch();
    obj = w;
}
public static void main(String[] args) {
  
    Object obj;
    { 
        Stopwatch w = new Stopwatch();
        obj = w;
    }
    System.out.println(obj);
    System.out.println(w);
}
(“它自己的初始值设定项”是块中的第一行),因此它的作用域是该块的其余部分。提到它

System.out.println(w); 
在块之外,因此
w
将无法解析为变量

那么局部变量obj如何呢?它是在区块中声明的

{ 
    Stopwatch w = new Stopwatch();
    obj = w;
}
public static void main(String[] args) {
  
    Object obj;
    { 
        Stopwatch w = new Stopwatch();
        obj = w;
    }
    System.out.println(obj);
    System.out.println(w);
}
在这种情况下,它是一个方法块。电话

System.out.println(obj);

位于块内,因此可以成功引用
obj

这是作用域的问题

{ 
      Stopwatch w = new Stopwatch();
      obj = w;
  }
这里w范围在括号内,这个变量在括号外是不可访问的。所以这里没有赋值问题,但问题与范围有关,可以通过

public class Casting {    public static void main(String[] args) {
  // casting doesn't change the object
   String w;
  Object obj;
  { 
      w = new String();
      obj = w;
  }
  System.out.println(obj); // this line does work
  System.out.println(w); //this line now working     } }

这就是范围的问题

{ 
      Stopwatch w = new Stopwatch();
      obj = w;
  }
这里w范围在括号内,这个变量在括号外是不可访问的。所以这里没有赋值问题,但问题与范围有关,可以通过

public class Casting {    public static void main(String[] args) {
  // casting doesn't change the object
   String w;
  Object obj;
  { 
      w = new String();
      obj = w;
  }
  System.out.println(obj); // this line does work
  System.out.println(w); //this line now working     } }

w
与上下文无关,它只有
{…}
块中的上下文,因此我们从未了解过整个
对象obj事情-这些代码行中到底发生了什么?我们只了解了一个方法/类声明后面跟着一组大括号,而不是一个对象。如果
objectobj被替换为方法声明,但这是一个…对象声明?看。啊,这让我更好地理解了,谢谢!因此,出于作用域的目的,我们有这些空的花括号。在这些空的花括号内,您可以访问
obj
。我认为它限制了范围,
objectobj超出范围。为什么它仍然包含在作用域中?因为在作用域更改之前声明了
obj
,您仍然可以访问它,但是因为
w
是在
{…}
作用域中声明的,一旦您离开它,它就不再可访问
w
脱离上下文,它只在
{…}范围内具有上下文
block所以我们从未了解过整个
objectobj事情-这些代码行中到底发生了什么?我们只了解了一个方法/类声明后面跟着一组大括号,而不是一个对象。如果
objectobj已替换为方法声明,但这是…对象声明?请参阅。