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