Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.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_Return_Covariant - Fatal编程技术网

java协变返回类型

java协变返回类型,java,return,covariant,Java,Return,Covariant,为什么下面的代码打印“1” 因为您引用的是不受多态性影响的字段。如果改用getX(),它将返回2 您要问的是,类A中定义的字段x的值(因为Base.getObject()返回A)。即使convariatreturn重写返回B的方法,您也没有将对象称为convariatreturn 为了进一步说明字段如何不受多态性的影响,字段访问是在编译时实现的,所以无论编译器看到什么,都会访问它。在您的情况下,该方法定义返回A,因此可以访问A.x。另一方面,根据运行时类型调用方法。因此,即使您定义返回A但返回B

为什么下面的代码打印“1”


因为您引用的是不受多态性影响的字段。如果改用
getX()
,它将返回
2

您要问的是,类
A
中定义的字段
x
的值(因为
Base.getObject()
返回
A
)。即使
convariatreturn
重写返回
B
的方法,您也没有将对象称为
convariatreturn


为了进一步说明字段如何不受多态性的影响,字段访问是在编译时实现的,所以无论编译器看到什么,都会访问它。在您的情况下,该方法定义返回
A
,因此可以访问
A.x
。另一方面,根据运行时类型调用方法。因此,即使您定义返回
A
但返回
B
的实例,您调用的方法也将在
B

@kris979上被调用,尽管您返回的是B,我认为区别在于返回类型是A。因此,A中的x值即1被打印。

正如Bozho指出的那样-实例变量永远不会受到多态性的影响。让我给你举个小例子

class Base {
    int i = 1;
    void method() {
        System.out.println("in base");
    }
}

class Sub extends Base {
    int i = 2;

    void method() {
        System.out.println("in sub");
    }
}

public class Test { 
    public static void main(String[] args) {
        Base obj = new Sub();
        obj.method();
        System.out.println(obj.i);
    }
}

此代码将在sub和1中打印-

,但方法定义返回
A
。因此,
A.x
是访问的对象。@kris您正在使用
A
的引用调用方法,因为它具有返回类型
A
ok,所以即使test.getObject()返回B的实例,test变量仍然是基引用,因此在我打印x的情况下,它调用Base:getObject()?test.getObject()instanceof B返回true-这就是让我困惑的地方!因为
instanceof
检查是在运行时进行的。
A.x
是在编译时实现的。简洁明了的回答
class Base {
    int i = 1;
    void method() {
        System.out.println("in base");
    }
}

class Sub extends Base {
    int i = 2;

    void method() {
        System.out.println("in sub");
    }
}

public class Test { 
    public static void main(String[] args) {
        Base obj = new Sub();
        obj.method();
        System.out.println(obj.i);
    }
}