Java继承示例中的引用

Java继承示例中的引用,java,inheritance,super,Java,Inheritance,Super,尽管我看了书中的例子,我还是不明白。这怎么可能?为什么ı在“test1=test”行出现编译错误?有人能解释一下吗 中详细说明了赋值转换规则(表达式的值被赋值给变量时会发生这种情况)。特别是,将引用类型分配给更广泛的引用变量始终是合法的: 如果S是T的子类型(§4.10),则存在从任何参考类型S到任何参考类型T的扩展参考转换 在您的情况下,由于test属于参考类型Test1,因此将Test1类型或Test1的任何子类型分配给test是合法的。但是,由于test1属于Test2类型,因此为其指定t

尽管我看了书中的例子,我还是不明白。这怎么可能?为什么ı在“test1=test”行出现编译错误?有人能解释一下吗

中详细说明了赋值转换规则(表达式的值被赋值给变量时会发生这种情况)。特别是,将引用类型分配给更广泛的引用变量始终是合法的:

如果S是T的子类型(§4.10),则存在从任何参考类型S到任何参考类型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