为什么这个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。区块:
块是大括号内的一系列语句、局部类声明和局部变量声明语句
这对你来说意味着什么?本地变量bew
在块中声明
{
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。区块:
块是大括号内的一系列语句、局部类声明和局部变量声明语句
这对你来说意味着什么?本地变量bew
在块中声明
{
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代码>已替换为方法声明,但这是…对象声明?请参阅。