请教一下,关于override的方法返回类型并不是绝对相同,而是兼容这个。
我试了一下,父类返回类型是子类返回类型时确实ok的,但是基本数据类型兼容这个没成功,不知道为何?
这是代码:
public class A {
public static void main(String[] args) {
B t =new C();
t.test();
}
}class B {short test() {
return (short)2;
}
}
class C extends B{ int test() {
return (int)2;
}
}
我试了一下,父类返回类型是子类返回类型时确实ok的,但是基本数据类型兼容这个没成功,不知道为何?
这是代码:
public class A {
public static void main(String[] args) {
B t =new C();
t.test();
}
}class B {short test() {
return (short)2;
}
}
class C extends B{ int test() {
return (int)2;
}
}
public class Hello {
public static void main(String[] args) {
B t =new C();
t.test();
}
}class B {
int test() {
return (short)2;
}
}
class C extends B{
int test() {
return (int)2;
}
}
short与int之间没有子父类间的关系
如ZangXT所说,改写方法的返回值必须是继承关系。
基本数据类型之间没有继承关系,所以不能象楼主那样操作。但是可利用Number类与Integer类的继承关系,同时利用JDK5.0的自动装箱功能。如:public class A{
public static void main(String[] args) {
short s = new B().test().shortValue();
int i = new C().test();
}
}public class B {
public Number test() {
return (short)2;
}
}public class C extends B{
public Integer test() {
return (int)2;
}
}
然后看下 下面的程序:class A {
public Object fun() {
return null;
}
}
class B extends A {
public String fun() {
return null;
}
}这个为什么能运行呢! 因为String继承自Object类!
这时有人会问:这个返回值类型也不同啊?不是和上面定义的矛盾吗?
其实并不矛盾,因为String继承自Object,所以String就是Object类型的;
就像是 正方形继承自长方形,能说正方形不是长方形吗?是把?
对于String继承自Object这句话有问题的,可以去看JDK文档;
要想实现多态必须满足三个条件。1.
继承
2.
重写
3.
父类的指针指向子类的对象
public class Hello {
public static void main(String[] args) {
B t = new C();
System.out.println(t.test());
}
}class B {
int test() {
return (short) 1;
}
}class C extends B {
int test() {
return (int) 2;
}
}
运行结果为2
重写必须具有相同的返回类型。(但是这要看你使用的jdk版本,因为从java5 起返回类型可以是子类型--称为协变式返回)
但是你使用的是基本类型。所以必须相同。
把基本类型变成包装类就好了。