Java继承示例中的引用
尽管我看了书中的例子,我还是不明白。这怎么可能?为什么ı在“test1=test”行出现编译错误?有人能解释一下吗 中详细说明了赋值转换规则(表达式的值被赋值给变量时会发生这种情况)。特别是,将引用类型分配给更广泛的引用变量始终是合法的: 如果S是T的子类型(§4.10),则存在从任何参考类型S到任何参考类型T的扩展参考转换 在您的情况下,由于Java继承示例中的引用,java,inheritance,super,Java,Inheritance,Super,尽管我看了书中的例子,我还是不明白。这怎么可能?为什么ı在“test1=test”行出现编译错误?有人能解释一下吗 中详细说明了赋值转换规则(表达式的值被赋值给变量时会发生这种情况)。特别是,将引用类型分配给更广泛的引用变量始终是合法的: 如果S是T的子类型(§4.10),则存在从任何参考类型S到任何参考类型T的扩展参考转换 在您的情况下,由于test属于参考类型Test1,因此将Test1类型或Test1的任何子类型分配给test是合法的。但是,由于test1属于Test2类型,因此为其指定t
test
属于参考类型Test1
,因此将Test1
类型或Test1
的任何子类型分配给test
是合法的。但是,由于test1
属于Test2
类型,因此为其指定test1
类型的表达式是不合法的,因为test1
不是Test2
的子类型。尤其是,表达式test
属于Test1
类型,而Test1
不是Test2
的子类型
请注意,这是一个编译时检查,与运行时test
实际值的类型无关。如果确定表达式实际上是较窄的类型,则可以使用强制转换:
public class Test1 {
int a;
int b;
}
public class Test2 extends Test1 {
public int c;
Test2(int a,int b,int c){
this.a=a;
this.b=b;
this.c=c;}
}
public class Driver {
public static void main(String[] args) {
Test2 test1 = new Test2(3,4,5);
Test1 test = new Test1();
test=test1; //This line is true
test1=test; //This line is false
}
}
但是,如果test
的实际值不是类型Test2
(或其子类型),则这将在运行时引发ClassCastException
。因此,在执行此类强制转换时,您将失去编译时类型检查的一些好处。通常使用instanceof
操作符检查强制转换是否成功。然而,如果您发现自己是这样编程的,那就是一种“代码气味”:表明您的代码设计可能在某些方面存在缺陷
基本值也会发生类似的情况:
test1 = (Test2) test;
与引用类型不同,基元类型的强制转换永远不会抛出
ClassCastException
行怎么可能是false?你是什么意思?通过“真”和“假”,你真的是指“编译”和“不编译”?Test1(1,2)
Test1没有构造函数,这怎么可能编译呢?false表示编译错误请发布您正在运行的确切代码。
int x = 1;
byte y = 2;
x = y; // okay
y = x; // ERROR -- requires a cast to narrow the type
y = (byte) x; // okay